note 124528 added to class.parallel-events
| From: | s dot laufer at homegear dot email | Date: | Sun, 22 Dec 2019 15:02:35 +0000 |
| Subject: | note 124528 added to class.parallel-events | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-213609@lists.php.net to get a copy of this message | ||
<?php
/**
Example showing the usage of events.
The documentation still is very thin, so I'm not sure, the example is the best solution. But it
works.
*/
use parallel\{Channel,Runtime,Events,Events\Event};
$myThread = function(Channel $channel) {
$events = new Events();
$events->addChannel($channel);
//$events->setBlocking(false); //Uncomment to don't block on Events::poll()
$events->setTimeout(1000000); //Comment when not blocking
while(true)
{
/*
...
Your code.
...
*/
//Read all available events
try
{
$event = NULL;
do
{
$event = $events->poll(); //Returns non-null if there is an event
if($event && $event->source == 'myChannel')
{
//It seems, the target gets deleted after returning an event,
//so add it again.
$events->addChannel($channel);
if($event->type == Event\Type::Read)
{
if(is_array($event->value) && count($event->value) > 0)
{
if($event->value['name'] == 'stop')
{
echo 'Stopping thread';
return; //Stop
}
else
{
echo 'Event: '.$event->value['name'].' =>
'.$event->value['value'].PHP_EOL;
}
}
}
else if($event->type == Event\Type::Close) return; //Stop
}
}
while($event);
}
catch(Events\Error\Timeout $ex)
{
//Timeout
echo 'Timeout'.PHP_EOL;
}
}
};
class MyClass {
private $runtime;
private $future;
private $channel;
public function start() {
//Create runtime
$this->runtime = new Runtime();
//Create buffered channel.
//Buffered channels don't block on Channel::send().
//Note that target names need to be unique within the process.
$this->channel = Channel::make('myChannel', Channel::Infinite);
global $myThread;
$this->future = $this->runtime->run($myThread, [$this->channel]);
}
public function stop() {
$this->channel->send(['name' => 'stop', 'value' =>
true]);
$this->future->value(); //Wait for thread to finish
$this->channel->close();
}
public function emit(string $name, $value)
{
$this->channel->send(['name' => $name, 'value' => $value]);
}
}
$a = new MyClass();
$a->start();
for($i = 0; $i < 5; $i++)
{
$a->emit('test', $i);
sleep(0.5);
}
sleep(2);
for($i = 5; $i < 10; $i++)
{
$a->emit('test', $i);
sleep(0.5);
}
$a->stop();
?>
----
Server IP: 45.112.84.4
Probable Submitter: 185.85.3.168 (proxied: 2003:d1:6f11:b101:2db0:b42e:1483:d529)
----
Manual Page -- http://php.net/manual/en/class.parallel-events.php
Edit -- https://master.php.net/note/edit/124528
Del: integrated -- https://master.php.net/note/delete/124528/integrated
Del: useless -- https://master.php.net/note/delete/124528/useless
Del: bad code -- https://master.php.net/note/delete/124528/bad+code
Del: spam -- https://master.php.net/note/delete/124528/spam
Del: non-english -- https://master.php.net/note/delete/124528/non-english
Del: in docs -- https://master.php.net/note/delete/124528/in+docs
Del: other reasons-- https://master.php.net/note/delete/124528
Reject -- https://master.php.net/note/reject/124528
Search -- https://master.php.net/manage/user-notes.php