【问题标题】:pthreads not behaving like expectedpthread 的行为不像预期的那样
【发布时间】:2015-09-03 22:30:14
【问题描述】:

我目前在这里看到的代码:

<?php

class workerThread extends Thread {
    public function __construct($i) {
        $this->i = $i;
    }

    public function run() {
        echo $this->i . " ";
        sleep(1);
        echo $this->i . " ";
    }
}

for ($i=1; $i<=5; $i++) {
    $workers[$i]= new workerThread($i);
    $workers[$i]->start();
}

?>

我希望这样做是回显 1 2 3 4 5,等待 1 秒,然后回显 1 2 3 4 5。但是,它会等待整个程序完成,然后吐出1 1 2 2 3 3 4 4 5 5。由于某种原因,它的行为不是异步的。我做错了什么?

编辑:使用usleep(1000000) 而不是sleep(1) 做同样的事情

【问题讨论】:

  • 在当前 pthreads-master 中使用 PHP 7.0.0 RC1 我无法重现此问题。它的行为与您所说的完全一样。
  • 很奇怪,我运行的是 PHP 5.6.12 和 pthreads 版本 2.0.10
  • 即使使用来自pecl.php.net 的 PHP-CLI 5.6.12 和 pthreads 2.0.10,我也没有遇到这个问题。您是否在使用某种带有输出缓冲的特殊 SAPI?
  • 嗯,这应该是一个经典的输出缓冲问题。 pthreads does not recommend 的作者将任何内容从线程写入输出缓冲区(即使在普通的 PHP-CLI 中也不行)。这可能会有所帮助:stackoverflow.com/a/31186883/2032498
  • 不,恐怕您使用的 SAPI 无法做到这一点。在 Apache 开始将它们泵送到客户端之前,管中必须有一定数量的字节。

标签: php multithreading pthreads


【解决方案1】:

这是来自 PHP API 参考的复制粘贴:

run 方法执行后,线程会立即退出,它 将在适当的时候加入创建线程。

我假设,引擎认为加入这些线程的适当时间是在下一次循环迭代时。

【讨论】:

  • 事实并非如此。线程将在对象删除或Thread::join 被调用时加入。
猜你喜欢
  • 2017-04-11
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 2016-01-28
  • 2018-12-15
  • 2013-09-05
相关资源
最近更新 更多