最近在学习PHP pthreads,我把相关的学习笔记整理了下共享给大家。
1. 开启多个线程并发执行。
1 <?php 2 class HelloWorld extends Thread { 3 public function __construct($world) { 4 $this->world = $world; 5 } 6 7 public function run() { 8 print_r(sprintf("Hello %s\n", $this->world)); 9 sleep(1); 10 } 11 } 12 13 for ($i=0; $i<10; $i++) { 14 $pool[] = new HelloWorld('world' . $i); 15 } 16 17 foreach ($pool as $work) { 18 $work->start(); 19 }
2. 线程间是不能直接通过数组来交换数据的,因为php数组本身不是线程安全的。可以通过继承Stackable类来实现。具体代码如下:
<?php class HelloWorld extends Thread { private $_data; public function __construct($data) { $this->_data = $data; } public function run() { $this->_data[] = Thread::getCurrentThreadId(); sleep(1); } } class Storage extends Stackable { public function run(){} } $storage = new Storage(); for ($i=0; $i<10; $i++) { $pool[] = new HelloWorld($storage); } foreach ($pool as $work) { $work->start(); } print_r($storage);
3. 给一个实际的例子。一个线程接收消息,一个线程处理消息。
<?php class ReceiveMsg extends Thread { private $_data; public function __construct(&$data) { $this->_data = $data; } public function run() { for ($i=0; $i<10; $i++) { $this->_data[] = $i; } } } class DealMsg extends Thread { private $_data; public $done = true; public function __construct(&$data) { $this->_data = $data; } public function run() { while ($this->done) { $val = $this->_data->shift(); if (!$val) { usleep(100); } else { var_dump($val); } } } } class Storage extends Stackable { public function run(){} } $storage = new Storage(); $receiveMsg = new ReceiveMsg($storage); $receiveMsg->start(); $dealMsg = new DealMsg($storage); $dealMsg->start(); sleep(4); $dealMsg->synchronized(function($thread){ $thread->done = false; //$thread->notify(); }, $dealMsg);
写在最后的几点:
1. 一般都是用主线程来控制各个子线程的。