当前位置: 首页 > news >正文

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


http://www.taodudu.cc/news/show-647737.html

相关文章:

  • 【physx/wasm】在physx中添加自定义接口并重新编译wasm
  • excel---常用操作
  • Lora训练Windows[笔记]
  • linux基础指令讲解(ls、pwd、cd、touch、mkdir)
  • InnoDB 事务处理机制
  • 启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS
  • cmf php,cmf公共函数解析-common.php
  • php 实现时时更新地图,PHP实现隔15分钟自动更新网站地图功能
  • php中显示不出图像,php – 无法显示图像,因为它包含错误
  • java后台日期怎么去重,JAVA后台业务实现去重
  • php stripos 返回值,php函数stripos详解
  • java中gc的认识,java JVM GC 笔记(个人对GC 或JVM 的了解)
  • java libpcap,Linux下编译安装libpcap
  • 网页实现人脸识别PHP,奇思妙想-用HTML5进行人脸识别
  • 文件包含漏洞不能包含php,ThinkPHP5漏洞分析之文件包含
  • php对应哪个oracle版本,Oracle 版本说明
  • php 主页子标题修改,关于有部分用户默认PC主页大标题标签修改无效的答疑.
  • 基于matlab的智能天线波束方向图仿真,基于MATLAB的智能天线波束方向图仿真
  • python中xlwt的局限,Python xlwt 生成Excel和设置特定单元格不可编辑
  • angularjs 导出excel php,AngularJS 导出Excel指令
  • php 连续点击事件,javascript设置连续两次点击按钮时间间隔的方法_javascript技巧...
  • oracle10g数据库热备份,Oracle10g数据库冷备份脚本文件
  • Oracle创建序列的sql语句,【Oracle学习】之 序列(Sequence)
  • cssd拉起oracle,oracle rac /etc/init.d/init.cssd startcheck
  • oracle dg状态查询,oracle dg状态检查及相关命令
  • keep alive PHP,vue中keep-alive使用方法详解
  • oracle库缓存锁,Laravel 7.10 中的数据库缓存锁定和并发限制
  • 源码时代php中级项目,PHP学科项目评比圆满结束
  • linux 进程管理 ppt,linux操作系统-进程管理和打印管理.ppt
  • linux c编程头文件,如何在Linux中找到C编程语言的头文件?
  • linux 脚本中除法运算符,Linux中Shell的算数运算符和位运算符用法笔记
  • linux程序获取透传参数,Linux内核中TCP SACK处理流程分析
  • Linux线程时间片如何修改,请教如何修改线程时间片
  • 安卓虚拟linux系统教程,在Linux上模拟Android应用程序的3种方法 | MOS86
  • linux中断程序快捷键,linux命令行快捷键
  • linux用户命令权限管理,Linux命令-用户、权限管理