pthreads

添加笔记

用户贡献的笔记 6 个笔记

anonymous at example dot com
7 年前
以下是一些关于 PHP pThreads v3 的笔记,是我收集的
-命名空间:它不理解命名空间。
-全局变量:它根本不会序列化 GLOBALS!并且不会注册新的。
-类:它可以正常注册新类。
-函数:不会注册任何函数 - 它们必须都在静态类中。它理解 PHP 原生函数。
-常量:之前的常量会转移。但不要创建新的!
-pThreads 仅在 CLI 中有效 - 当然!
-如果线程崩溃,它会自动重新创建。
-为了“强制杀死”任何线程,父线程必须被杀死。或者等待所有其他排队的任务完成,然后终止。
-在 pThread 中注册的任何内容似乎都不会加入主线程... 这很好!
-pThreads 在多核环境中似乎非常强大,只需要注意系统资源... 如果配置错误,它可以并且会锁定系统。
-最后,为 PHP pThreads 寻找帮助非常少... 尤其是 v3!

祝您好运!
meadowsjared at gmail dot com
3 年前
在本例中,它展示了如何使用带有线程池的线程来获取结果数组,使用 pThreads v3.2.1 和 php 7.3.23

<?php
class TestWork extends Threaded {
// 更新版本,适用于 pThreads v3.2.1 和 php 7.3.23
protected $complete;
//$pData 是发送到您的工作线程以执行其工作的数据。
public function __construct($pData) {
// 将所有变量传递到局部变量
$this->complete = false;
$this->testData = $pData;
}
// 这是所有工作将完成的地方。
public function run() {
usleep(2000000); // 睡眠 2 秒以模拟大型作业
$this->complete = true;
}
public function
isDone() {
return
$this->complete;
}
}
class
ExamplePool extends Pool {
public
$data = array(); // 用于在完成后返回数据
private $numTasks = 0; // 用于知道何时完成的计数器
/**
* 覆盖父类的 submit 函数
* 以跟踪我们的作业
*/
public function submit(Threaded $task) {
$this->numTasks++;
parent::submit($task);
}
/**
* 用于等待所有工作人员完成
*/
public function process() {
// 只要池中还有作业,就运行此循环
//
while (count($this->data) < $this->numTasks) {
$this->collect(function (TestWork $task) {
// 如果任务被标记为已完成
// 收集其结果
if ($task->isDone()) {
$tmpObj = new stdclass();
$tmpObj->complete = $task->complete;
// 这是您如何获取完成数据 [通过 $pool->process() 访问]
$this->data[] = $tmpObj;
}
return
$task->isDone();
});
}
// 所有作业都已完成
// 我们可以关闭池
$this->shutdown();
return
$this->data;
}
}
$pool = new ExamplePool(3);
$testData = 'asdf';
for(
$i=0;$i<5;$i++) {
$pool->submit(new TestWork($testData));
}
$retArr = $pool->process(); // 获取所有结果
echo '<pre>';
print_r($retArr); // 返回结果数组(可能还有错误)
echo '</pre>';
?>
admin at deosnet dot com
9 年前
您好:

警告:当在您的线程的可调用函数中使用可堆叠对象时,如果您将其用作数组,则必须非常小心。事实上,如果您没有将可堆叠“数组”复制到局部变量中,执行时间可能会急剧下降!

此外,如果您想修改函数中的数组(),您也将在局部变量中存储它,以便您的数组处于线程安全的环境中。
jasonrlester at yahoo dot com
10 年前
请注意,此扩展是 POSIX 线程的高级实现,包括 Windows(这就是为什么需要 pthreadsV*.dll 的原因)
r3x at engelhardt-stefan dot de
8 年前
如果您尝试测试线程,请记住让 php 认为速度很慢

脚本:-- C:\Webserver\htdocs>php mttest.php

<?php
class My extends Thread{
function
run(){
for(
$i=1;$i<10;$i++){
echo
Thread::getCurrentThreadId() . "\n";
sleep(2); // <------
}
}
}

for(
$i=0;$i<2;$i++){
$pool[] = new My();
}

foreach(
$pool as $worker){
$worker->start();
}
foreach(
$pool as $worker){
$worker->join();
}
?>

输出:-- C:\Webserver\htdocs>php mttest.php
6300
5816
6300
5816
6300
5816
6300
5816
6300
5816
6300
5816
6300
5816
6300
5816
6300
5816

如果您省略了 sleep(),线程的 cpu 时间就足够长,可以一次完成脚本。
mckaygerhard at gmail dot com
5 年前
大多数问题只发生在 guindows 上,.. 糟糕的操作系统
To Top