使用线程对象作为多维关联数组PHP Pthreads
我的问题 我试图在基于pthreads的CLI应用程序中的不同线程之间共享多维关联数组。我遇到的问题是在不覆盖以前的键的情况下分配键和值 简单示例 我创建了一个简单的示例,希望它反映出我在实际代码中试图实现的目标使用线程对象作为多维关联数组PHP Pthreads,php,multithreading,pthreads,php-pthread,Php,Multithreading,Pthreads,Php Pthread,我的问题 我试图在基于pthreads的CLI应用程序中的不同线程之间共享多维关联数组。我遇到的问题是在不覆盖以前的键的情况下分配键和值 简单示例 我创建了一个简单的示例,希望它反映出我在实际代码中试图实现的目标 class MyWork extends Worker { public function __construct($log) { $this->log = $log; } public function getLog() {
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
这在某种程度上对我来说是有意义的,考虑到所写的内容,即“pthreads用我们自己的处理程序覆盖维度read/writer。我们的内部处理程序不是为执行ArrayAccess接口而设置的。”
当我尝试使用Threaded::merge时,它会覆盖键(如果第二个参数设置为true),或者忽略重复项,而不是将具有相同键的嵌套数组连接在一起
我的问题
扩展线程时,如何在多个维度中设置和获取键和值
我正在使用PHP版本7.04和Pthreads版本3.1.6。最终,我们找到了答案。(多亏了中的一句话,其中说“本身就是数组的数组的成员也应该是线程的派生,尽管这不是严格必要的”)。我们需要编写方法来创建线程对象的新实例,以在需要多维数组时充当数组,而不是尝试使用[]运算符设置键和值 例如,如果您需要一个带有嵌套数组的简单线程安全日志,它可能如下所示:
class BaseLog extends Threaded {
public function run() {}
public function addBaseKey($key) {
$this[$key] = new SafeArray();
}
public function addFirstKey($base, $key) {
$this[$base][$key] = new SafeArray();
}
}
class SafeArray extends Threaded {
public function run() {}
}
$log = new BaseLog();
$log->addBaseKey("foo");
$log->addFirstKey("bar");
$log["foo"]["bar"]["my"] = "value";
用法可能如下所示:
class BaseLog extends Threaded {
public function run() {}
public function addBaseKey($key) {
$this[$key] = new SafeArray();
}
public function addFirstKey($base, $key) {
$this[$base][$key] = new SafeArray();
}
}
class SafeArray extends Threaded {
public function run() {}
}
$log = new BaseLog();
$log->addBaseKey("foo");
$log->addFirstKey("bar");
$log["foo"]["bar"]["my"] = "value";
然后,只要不需要添加进一步的嵌套级别(在这种情况下,需要添加一个“addSecondKey”方法),就可以像使用数组一样使用[]运算符进行读写操作。这非常有用。在加密对象中处理多维数组是一场噩梦。谢谢你的解决方案。