note 124528 added to class.parallel-events

From: 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

« previous php.notes (#213609) next »