note 115118 added to class.pool

From: Date: Wed, 28 May 2014 13:19:00 +0000
Subject: note 115118 added to class.pool
Groups: php.notes 
Request: Send a blank email to php-notes+get-199641@lists.php.net to get a copy of this message
Example class to demonstrate usage of Pool/Worker mechanism, also to show a few tricks & hints ;) <?php class Config extends Threaded{ // shared global object protected $val=0, $val2=0; protected function inc(){++$this->val;} // protected synchronizes by-object public function inc2(){++$this->val2;} // no synchronization } class WorkerClass extends Worker{ protected static $worker_id_next = -1; protected $worker_id; protected $config; public function __construct($config){ $this->worker_id = ++static::$worker_id_next; // static members are not avalable in thread but are in 'main thread' $this->config = $config; } public function run(){ global $config; $config = $this->config; // NOTE: setting by reference WON'T work global $worker_id; $worker_id = $this->worker_id; echo "working context {$worker_id} is created!\n"; //$this->say_config(); // globally synchronized function. } protected function say_config(){ // 'protected' is synchronized by-object so WON'T work between multiple instances global $config; // you can use the shared $config object as synchronization source. $config->synchronized(function() use (&$config){ // NOTE: you can use Closures here, but if you attach a Closure to a Threaded object it will be destroyed as can't be serialized var_dump($config); }); } } class Task extends Stackable{ // Stackable still exists, it's just somehow dissappeared from docs (probably by mistake). See older version's docs for more details. protected $set; public function __construct($set){ $this->set = $set; } public function run(){ global $worker_id; echo "task is running in {$worker_id}!\n"; usleep(mt_rand(1,100)*100); $config = $this->getConfig(); $val = $config->arr->shift(); $config->arr[] = $this->set; for ($i = 0 ; $i < 1000; ++$i){ $config->inc(); $config->inc2(); } } public function getConfig(){ global $config; // WorkerClass set this on thread's scope, can be reused by Tasks for additional asynch data source. (ie: connection pool or taskqueue to demultiplexer) return $config; } } $config = new Config; $config->arr = new \Threaded(); $config->arr->merge(array(1,2,3,4,5,6)); class PoolClass extends Pool{ public function worker_list(){ if ($this->workers !== null) return array_keys($this->workers); return null; } } $pool = new PoolClass(3, 'WorkerClass', [$config] ); $pool->worker_list(); //$pool->submitTo(0,new Task(-10)); // submitTo DOES NOT try to create worker $spammed_id = -1; for ($i = 1; $i <= 100; ++$i){ // add some jobs if ($spammed_id == -1 && ($x = $pool->worker_list())!= null && @$x[2]){ $spammed_id = $x[2]; echo "spamming worker {$spammed_id} with lots of tasks from now on\n"; } if ($spammed_id != -1 && ($i % 5) == 0) // every 5th job is routed to one worker, so it has 20% of the total jobs (with 3 workers it should do ~33%, not it has (33+20)%, so only delegate to worker if you plan to do balancing as well... ) $pool->submitTo($spammed_id,new Task(10*$i)); else $pool->submit(new Task(10*$i)); } $pool->shutdown(); var_dump($config); // "val" is exactly 100000, "val2" is probably a bit less // also: if you disable the spammer, you'll that the order of the "arr" is random. ?> ---- Server IP: 87.106.1.137 Probable Submitter: 194.138.39.59 ---- Manual Page -- http://php.net/manual/en/class.pool.php Edit -- https://master.php.net/note/edit/115118 Del: integrated -- https://master.php.net/note/delete/115118/integrated Del: useless -- https://master.php.net/note/delete/115118/useless Del: bad code -- https://master.php.net/note/delete/115118/bad+code Del: spam -- https://master.php.net/note/delete/115118/spam Del: non-english -- https://master.php.net/note/delete/115118/non-english Del: in docs -- https://master.php.net/note/delete/115118/in+docs Del: other reasons-- https://master.php.net/note/delete/115118 Reject -- https://master.php.net/note/reject/115118 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#199641) next »