1

次のように宣言された配列を持つクラス WorkerPool があります。

private $live_resources = array();

クラスには、特定の条件下で、このように配列にアイテムを追加するループがあります

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

この後、新しいプロセスとして開始されたワーカーがあります。ワーカーがタスクを完了すると、コールバック経由で live_fixture_processed() という WorkerPool のメソッドを呼び出します。コールバックは次のように定義されます。

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

次に、ワーカーでコールバックが呼び出されます

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 に答える