PHP pthreads学习笔记

最近在学习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.  一般都是用主线程来控制各个子线程的。

转载于:https://www.cnblogs.com/colors-blog/p/5171122.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值