gpt4 book ai didi

php - 使用 pthreads 在 PHP 中创建异步超时

转载 作者:行者123 更新时间:2023-12-02 07:30:56 25 4
gpt4 key购买 nike

我正在尝试在 PHP 中创建某种异步超时。

我正在使用 PECL 扩展 pthreads 来处理多线程。

异步超时完美地工作,但引用没有。

我在这个测试中使用 PHP 5.5.8。

class ParentClass {
public $test;

public function __construct(){
}

public function test() {
echo $this->test;
}
}

class Timeout extends Thread {
private $seconds;
private $parent;

public function __construct($seconds, &$parent){
$this->seconds = $seconds;
$this->parent = $parent;
}

public function run(){
sleep($this->seconds);
$this->parent->test();
}
}

$parent = new ParentClass();
$parent->test = "Hello.\n";
$timeout = new Timeout(2, $parent);
$timeout->start();
$parent->test = "Bye.\n";
$parent->test();

期待

Bye.
Bye.

获取

Bye.
Hello.

谁能告诉我我做错了什么?

最佳答案

您不应该将 sleep() 用于多线程应用程序,PHP 调用的底层实现旨在导致进程休眠,而不是进程中的线程。里程会有所不同,某些实现很可能会导致线程休眠,但您不能也不应该依赖它。

usleep 更适合多线程,因为它旨在让线程休眠,而不是让进程休眠,但是,它也会让线程处于非接收状态。

pthreads 内置了适当的同步方法,专为多线程设计,使线程在等待某事发生时处于接受状态。

引用不起作用,也不必起作用,如果您希望在多个上下文之间传递一个对象以进行操作,该对象应该从 pthreads 派生。

<?php
define("SECOND", 1000000);

class ParentClass extends Stackable {

public function test() {
echo $this->test;
}

public function run(){}

public $test;
}

class Timeout extends Thread {

public function __construct($seconds, $parent){
$this->seconds = $seconds;
$this->parent = $parent;
}

public function run(){
$this->synchronized(function(){
$this->wait(
SECOND * $this->seconds);
});
$this->parent->test();
}

private $seconds;
private $parent;
}

$parent = new ParentClass();
$parent->test = "Hello.\n";
$timeout = new Timeout(2, $parent);
$timeout->start();
$parent->test = "Bye.\n";
$parent->test();

关于php - 使用 pthreads 在 PHP 中创建异步超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21689125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com