thread php,php中关于线程thread的使用

php通过扩展pthreads也可以支持线程上的操作,在mac下可以通过brew安装pthreads扩展。

安装pthreads扩展

搜索pthreads

$ brew search pthreads

homebrew/php/php53-pthreads homebrew/php/php54-pthreads homebrew/php/php55-pthreads homebrew/php/php56-pthreads

根据不同的php版本进行安装,例如我是安装php55-pthreads

$ brew install php55-pthreads

安装完成后,记的重启下web服务器。

线程测试

线程类要继承Thread类,而后实现run方法。

class computer extends Thread {

public $id;

public $runing = false;

public $params = null;

public function __construct($id) {

$this->id = $id;

$this->runing = true;

}

public function run() {

while ($this->runing) {

if (is_null($this->params)) {

echo "线程({$this->id})等待任务...\n";

} else {

echo "线程({$this->id}) 收到任务参数::{$this->params}.\n";

$this->params = null;

}

sleep(1);

}

}

}

代码很简单,用running标记线程是否在运行,params标记外界传递的参数,如果外界传递参数过来则可以运行。

使用该类

//这里创建线程池.

$pool = array(new computer('a'), new computer('b'), new computer('c'));

//启动所有线程,使其处于工作状态

foreach ($pool as $w) {

$w->start();

}

//派发任务给线程

for ($i = 0; $i < 10; $i++) {

$params = rand(10, 99);

while (true) {

foreach ($pool as $worker) {

//参数为空则说明线程空闲

if (is_null($worker->params)) {

$worker->params = $params;

echo "({$worker->id})线程空闲,放入参数{$params}.\n";

break 2;

}

}

sleep(1);

}

}

//关闭线程

while (count($pool)) {

//遍历检查线程组运行结束

foreach ($pool as $key => $worker) {

if ($worker->params == '') {

echo "({$worker->id})线程运行完成,退出.\n";

//设置结束标志

$worker->runing = false;

unset($pool[$key]);

}

}

echo "等待退出中...\n";

sleep(1);

}

echo "退出成功\n";

运行结果

在命令行中运行输入结果参考如下:

$ php thread.php

线程(a)等待任务...

线程(b)等待任务...

线程(c)等待任务...

(a)线程空闲,放入参数21.

(b)线程空闲,放入参数97.

(c)线程空闲,放入参数54.

线程(a) 收到任务参数::21.

线程(b) 收到任务参数::97.

线程(c) 收到任务参数::54.

(a)线程空闲,放入参数68.

(b)线程空闲,放入参数71.

(c)线程空闲,放入参数58.

线程(a) 收到任务参数::68.

线程(b) 收到任务参数::71.

线程(c) 收到任务参数::58.

(a)线程空闲,放入参数79.

(b)线程空闲,放入参数20.

(c)线程空闲,放入参数18.

线程(a) 收到任务参数::79.

线程(b) 收到任务参数::20.

线程(c) 收到任务参数::18.

(a)线程空闲,放入参数76.

(b)线程运行完成,退出.

(c)线程运行完成,退出.

线程(a) 收到任务参数::76.

等待退出中...

线程(a)等待任务...

(a)线程运行完成,退出.

等待退出中...

退出成功

因为使用了sleep,在浏览器里运行估计要等结果输出需要一段时间。这里还有一个问题可以考虑一下:这里的线程工作任务只是输出内容,如果需要得到返回的计算结果,和普通的函数调用返回不同,这里涉及到异步方面的问题,会复杂一些,后续再介绍吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值