2024年PHP日本大会

pthreads

添加注释

用户贡献的注释 4 条注释

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

祝你好运!
9
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>';
?>
9
jasonrlester at yahoo dot com
10年前
请注意,此扩展 *是* POSIX 线程的高级实现,包括在 Windows 上(这就是为什么需要 pthreadsV*.dll 的原因)
6
admin at deosnet dot com
10年前
您好:

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

此外,如果您想在函数中修改数组(),也需要将其存储在局部变量中,以确保您的数组处于线程安全的环境中。
To Top