带pthread的PHP中的Worker和Pool

古伦

我目前正在学习PHP中的多线程。我已经知道多线程的基本知识,例如创建线程并一起运行多个线程,但是我仍然对Worker和Pool感到困惑。

目前,我有这个脚本:

<?php

class MyWork extends Threaded {

    public $name;

    public function __construct($name) {
        echo "Constructing worker $name\n";
        $this->name = $name;
    }

    public function run() {
        echo "Worker $this->name start running\n";
        for ($i = 1; $i <= 5; $i++) {
            echo "Worker $this->name : $i\n";
            sleep(1);
        }
    }

}

class MyWorker extends Worker {
    public function run() {}
}

$pool = new Pool(1, \MyWorker::class);
$pool->submit(new MyWork("A"));
$pool->submit(new MyWork("B"));
$pool->submit(new MyWork("C"));

以我的理解,这应该创建一个最多只能同时运行1个工人的工人池,对吗?因此,我期望这种输出:

Constructing worker A
Constructing worker B
Constructing worker C
Worker A start running
Worker A : 1
Worker A : 2
Worker A : 3
Worker A : 4
Worker A : 5
Worker B start running
Worker B : 1
Worker B : 2
Worker B : 3
Worker B : 4
Worker B : 5
Worker C start running
Worker C : 1
Worker C : 2
Worker C : 3
Worker C : 4
Worker C : 5

但是,这是我得到的:

Constructing worker A
Constructing worker B
Worker A start running
Constructing worker C
Worker A : 1
Worker  : 2
Worker  : 3
Worker  : 4
Worker  : 5
Worker  start running
Worker  : 1
Worker  : 2
Worker  : 3
Worker  : 4
Worker  : 5
Worker  start running
Worker  : 1
Worker  : 2
Worker  : 3
Worker  : 4
Worker  : 5

为什么工人的名字只出现一次然后就消失了?

注意:我在Windows 8.1上将PHP 5.5.10与phtreads 2.0.4一起使用,并且通过CLI运行脚本。

乔·沃特金斯

在脚本的末尾(在最后一个commit()之后),工作线程被销毁,并且池在仍在执行对象时进入关闭状态,这说明了名称消失的原因。

做这个

$pool = new Pool(1, \MyWorker::class);
$pool->submit(new MyWork("A"));
$pool->submit(new MyWork("B"));
$pool->submit(new MyWork("C"));
$pool->shutdown();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP中带括号的对象[{“ a”:“ b”}]和非带括号的对象{“ a”:“ b”}的混淆

来自分类Dev

带pthread的Banker算法

来自分类Dev

带pthread的Banker算法

来自分类Dev

在pthread和curl之间进行PHP测试

来自分类Dev

C中的Pthread和信号分配

来自分类Dev

C中的Pthread和信号分配

来自分类Dev

Java中的Web worker,线程数和worker?

来自分类Dev

Resque Worker:worker 中不可用的对象和方法

来自分类Dev

PHP:如何在 foreach 中检测带值和不带值的项目

来自分类Dev

带括号和对象成员的PHP行为

来自分类Dev

带cURL和cookie的PHP发布请求

来自分类Dev

PHP foreach if和||的使用 带变量

来自分类Dev

带cURL和cookie的PHP发布请求

来自分类Dev

带参数的Pthread成员函数

来自分类Dev

带Pthread的动态矩阵乘法

来自分类Dev

gevent.pool.Pool中的map()和imap()如何工作?

来自分类Dev

需要 PHP 5.1.1 版本之前和 PHP 7.2.6 版本中带反斜杠的字符串示例

来自分类Dev

Excel中带语句的累计和

来自分类Dev

Tr和td在带角度的表中

来自分类Dev

关于PThread和PThread屏障

来自分类Dev

PHP 中带列的光标分页

来自分类Dev

PHP和SQL-带变量的Consult和WHERE子句

来自分类Dev

在Linux中何时使用pthread_exit()和何时使用pthread_join()?

来自分类Dev

在Linux中,pthread_exit()和pthread_cancel()如何调用清理例程?

来自分类Dev

带堆栈变量的pthread内存泄漏

来自分类Dev

对象变量在PHP pthread中丢失上下文

来自分类Dev

带表的Foreach-PHP和Leaguepedia API

来自分类Dev

带超链接的PHP和MySQL查询的结果

来自分类Dev

如何在Nginx中优化worker_processes和worker_connections?