问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助,php使用Pthread进行多进程的问题

发布网友 发布时间:2022-04-07 08:33

我来回答

2个回答

懂视网 时间:2022-04-07 12:55

PHP是为WEB开发而生,以前PHP是没有线程的说法,直到pthread的出现,这样php增加了活力;

推荐:《PHP教程》

一. 线程的创建和使用

1. Thread类

基本的创建和使用:

<?php
//通过继承Thread类来实现自己的线程类MyThread
class MyThread extends Thread{
 //重写构造函数
 function __construct(){
 }
 //重写run方法(运行的是子线程需要执行的任务)
 function run(){
 }
}
//对象的实例化和运行就和java一样
$mt = new MyThread();
$mt->start();

当然,作为线程类,必须还有另外一些用于查询线程状态以及管理线程的方法

<?php
//获取创建线程的父线程id
Thread::getCreatorId 
//获取当前线程id
Thread::getCurrentThreadId
//获取当前线程引用
Thread::getCurrentThread 
//将线程加入检测
Thread::join
//查看线程是否被检测(是否被join)
Thread::isJoined
//强行杀死线程
Thread::kill

2.Worker类

Worker类的父类是Thread类,因此基本用法和Thread一样。而Worker类相对于Thread类来说,增加了线程复用的功能(以降低创建销毁线程所耗费的资源),通常与Stackable类连用,也就是说worker类既可以当做线程使用,也可以当做任务的容器来使用,如:

<?php
class Task extends Stackable{
 function __construct($no){
 $this->no = $no;
 }
 function run(){
 echo "task{$this->no}:run".PHP_EOL;
 }
}
class MyWork extends Worker{
 function __construct(){
 }
 function run(){
 }
}
$t1= new Task(1);
$t2= new Task(2);
$t3= new Task(3);
$my = new MyWork();
$my->stack($t1);
$my->stack($t2);
$my->start();
$my->stack($t3);

最终输出:

task1:run
task2:run
task3:run

当然Worker类还有其他一些方法来用于父线程对其进行管理

//获取还没执行的任务数量
Worker::getStacked 
//判断worker是否关闭
Worker::isShutdown
//判断worker是否在工作
Worker::isWorking
//关闭销毁worker
Worker::shutdown
//将任务压栈
Worker::stack
//将任务出栈(该api有问题,慎用)
Worker::unstack

二. PHP线程遇到的一些问题与注意点

1.线程类的属性不能直接进行哈希表(数组)操作,如:

//这样是无效的
$this->var1["hello"] = "world"; 
//改为
$this->var1 = ["hello"=>"world"];

为什么?因为线程类属性的赋值是通过序列化实现的,其本质是存储了序列化数据,因此不支持PHP常用直接操作哈希表(数组)的操作。

2.线程类的属性不能是“闭包函数”

原因:闭包函数不能序列化;因此,如果想在线程里用“回调函数”的话,那就放弃线程吧;

3.线程对象开辟了php的第二空间

(1)线程在创建之后,无法访问到父线程的变量,诸如$GLOBALS或global等用法都无法操作父线程的全局变量,这应该是考虑到了线程安全的问题;

(2)但是父线程却能够访问子线程对象的内容;

热心网友 时间:2022-04-07 10:03

curl_init()不开新进程,但客户机的file descriptor是有限的,内存也是有限的,意味着能new的Thread不是无限的。
你要达到pthread要达到的目的,不妨看看http://php.net/manual/en/function.curl-multi-init.php,它允许你异步的处理多个curl_init()返回。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华为m330盒子突然没有图像重新开机指示灯也不闪什么原因 新买了个华为机顶盒,安装上去之后插上网线显示网络已经连接但是上不去... 90后的中文Hip-Hop启蒙(误) 内卷是什么意思?如何正确看待内卷? 两年检出5种病,它们之间有联系吗 暗黑地牢7601更新内容一览介绍_暗黑地牢7601更新内容一览是什么_百度知 ... 暗黑地牢实用mod推荐 04丨社区魔方数字底座中台功能:支付、结算和积分中台 暗黑地牢英雄各种状态效果是什么-暗黑地牢英雄全折磨与美德状态详细攻略... 壁虎咬人了该怎么办 现在的火车、动车用的是什么燃料 火车用的什么燃料? 火车 高铁 地铁的燃料是什么 火车靠什么燃料产生动力 火车的燃料是什么? 火车是用什么做燃料的呢? 现在的火车用什么能源? 普通火车燃料是什么 现在普通火车是用什么燃料 现在的火车是烧煤的还是什么? 火车用的是什么燃料? 现在火车用的是什么能源? 现代火车用什么燃料 现在的火车的动力是什么,靠电还是煤,动车组和普通列车有什么区别? 现在普通火车用的是什么燃料 保存文件的常用方式 保存水样的方法有哪几种? 居家珠宝比较实用的保存的方式是什么? 查看WPS云文档共享给了具体哪个用户,在哪看?如何剔除个别用户? 油汀可以放浴室吗 股票中高送转是什么意思 这一杯酒敬昨天你是不是没有改变是什么歌 股市什么是高送转? 喝下这杯酒 歌词 (苦苦的这一杯酒,淡淡的没有滋味,你悄悄的就这样走),请问这歌词是那首歌名。谢谢 敬酒词怎么说又大方又简单 创业板 股票 高送转、分红信息查询 创业板中最近要发布高送转的股票是那只 如何获取APP内部的URL 手机丢了,怎么挂失 如何直接在手机上读取安卓app中打开的网页的url 歌词喝了这一杯酒,暖一暖回忆。描写兄弟情的 如何直接在安卓手机上读取app中打开的网页的url? 求歌词:干了这一杯酒还有两杯酒 这是成龙唱的谁能告诉我? 怎么抓取app某个页面的url 悲欢聚散一杯酒,[啤酒]从此万里个人行 用一杯酒的单纯去忘记世界的复杂啥意思? 如何查看端口,还有就是在防火墙中清楚,在添加某个端口呢 “劝君更近一杯酒,西出阳关无故人”表达了什么? 安卓模拟机怎么获取app的url,有什么软件吗? 怎么打开防火墙80、250、1100端口?