1

我有一个 WorkerPool 类,它的数组声明为

private $live_resources = array();

在类中有一个循环,在一定条件下,像这样将一个项目添加到数组中

$this->live_resources[$id] = 0;

在此之后,有一个工人作为一个新进程启动。一旦工作人员完成了一项任务,它就会通过回调的方式调用 WorkerPool 上名为 live_fixture_processed() 的方法。回调定义为

$callback = array($this, 'live_fixture_processed');

然后在worker中调用回调

call_user_func($callback, $id);

此方法像这样更改数组中的值

$this->live_resources[$id] = 1;

然后它调用另一个使用该数组的方法,对数组的更改看起来已经成功。

与此同时,该类继续其循环,一段时间后它开始使用 $this->live 资源数组,但该值已恢复为 0!

我还添加了一个字符串变量

private $called = '' 

这也在回调中设置,但在后续循环中也没有更改。回调中使用的私有变量的范围是否存在问题?

4

1 回答 1

0

简短的回答:我不能这样做。

长答案:我忘记了工人实际上是与工人池运行进程分开的物理进程。我正在做的事情可能看起来有效,但那是因为当子进程从池进程中分叉时,它包含原始父进程的所有代码,但它现在只是运行自己的事件循环。如果我需要子进程与父工作池进程进行简单的退出信号以外的任何通信,我必须使用某种形式的 IPC(进程间通信)

于 2014-01-22T20:54:41.523 回答