我的问题
我正在尝试在基于 pthreads 的 CLI 应用程序中的不同线程之间共享多维关联数组。我遇到的问题是在不覆盖以前的键的情况下分配键和值。
简单示例
我创建了一个简单的示例,希望能反映我在真实代码中想要实现的目标。
class MyWork extends Worker {
public function __construct($log) {
$this->log = $log;
}
public function getLog() {
return $this->log->getLog();
}
public function run() {}
}
class Log extends Threaded {
private $log;
public function __construct() {
$this->log = new class extends Threaded {
public function run() {}
};
}
public function run(){}
public function report() {
print_r($this->log['foo'].PHP_EOL);
print_r($this->log['bar'].PHP_EOL);
}
public function getLog() { return $this->log; }
}
class MyTask extends Threaded {
private $complete=false;
private $i;
public function isComplete() {
return $this->complete;
}
public function run() {
$this->worker->getLog()['bar'][$this->i] = $this->i;
$this->worker->getLog()['foo'][$this->i] = $this->i;
$this->complete= true;
}
public function __construct($i) {
$this->i = $i;
}
}
$log = new Log();
$p = new Pool(4, MyWork::class, [$log]);
foreach(range(0, 20) as $i)
$p->submit(new MyTask($i));
$log->report();
我希望这个输出是 foo 和 bar 数组都有 20 个键和值,范围从 1 到 20。
然而,这个的实际输出是:
PHP Notice: Indirect modification of overloaded element of class@anonymous has no effect in /home/fraser/Code/AlignDb/src/test.php on line 50
考虑到https://github.com/krakjoe/pthreads/blob/master/examples/StackableArray.php中所写的内容,这对我来说有点意义,即“pthreads 使用我们自己的处理程序覆盖维度读取/写入器。我们的内部处理程序未设置为执行 ArrayAccess 接口。”
当我尝试使用 Threaded::merge 时,它会覆盖键(如果第二个参数设置为 true)或忽略重复项,而不是将具有相同键的嵌套数组连接在一起。
我的问题
扩展 Threaded 时如何设置和获取多个维度的键和值?
我正在使用 PHP 7.04 版和 Pthreads 3.1.6 版。