使用Pthread/PHP从作业中获取工人数据

使用Pthread/PHP从作业中获取工人数据,php,pthreads,Php,Pthreads,我使用带有Pthread和PHP7的TermWorker类构建了一个池。我从一个数据库源中选择了几个术语,并希望使用特定的作业对其进行处理。这是我的代码,用于执行此操作: //index.php $termpool = new Pool(1, TermWorker::class); foreach($terms as $term) { $termpool->submit(new PostagJob(["termArray" => $termArray, "lamachinePath"

我使用带有Pthread和PHP7的TermWorker类构建了一个池。我从一个数据库源中选择了几个术语,并希望使用特定的作业对其进行处理。这是我的代码,用于执行此操作:

//index.php
$termpool = new Pool(1, TermWorker::class);
foreach($terms as $term) {
$termpool->submit(new PostagJob(["termArray" => $termArray, "lamachinePath" => $lamachine_path]));
$termpool->submit(new ClassifyJob($termArray));
}
在PostagJob中,我想将数据保存到worker, 我使用数组合并进行此操作,并设置状态,请参见:

//PostagJob.php
public function run() {
 $this->worker->postag_labels = array_merge(
 $this->worker->postag_labels,
 //Prevent Volatile object, cast to array
 (array)[
  "word" => $word_key,
  "label" => $word["pos"]["@attributes"]["head"],
  "lemma" => $word["pos"]["@attributes"]["class"]
 ]);
 $this->worker->postag_status = "Tagged";
}
在另一个名为ClassifyJob的工作中,我做了几个分类, 但我还想使用保存的邮资标签(来自工作人员)。 目前,我正在使用while循环检查数据:

//ClassifyJob.php
public function run() {
 while(true) {
 //Postag labels are available
  if($this->worker->postag_status === "Tagged") {
   print_r($this->worker->postag_labels); 
   break;
  } else if($this->worker->postag_status === "Untaggable") {
   //Not possible, to classify this way
   break;
  }
 }
}
我注意到数据没有被打印,并且它一直在等待/循环。 如何从ClassifyJob中的工作人员检索数据? 我看到了
synchronized()
wait()
join()
,这就是我需要的吗? 我如何实现这一点,或者我还需要做什么


编辑:我的完整代码在这个Github repo:。

关于如何在pthreads中处理数组,以及pthreads的不变性语义的一些问题,似乎存在一些误解

当数组被指定给
线程化
对象的属性时,数组被强制转换为
易失性
对象。这意味着不需要在
array\u merge
调用中强制转换
(array)
。假设数组是从
array\u merge
返回的,如果您希望将结果保留为数组(我怀疑您是这样做的),那么此时您应该显式地强制转换为数组

查看您的
PostagJob::u-construct
方法,您没有将
$payload
termArray
强制转换为数组,因此它将成为
Volatile
对象。这是有问题的,因为稍后在
array\u merge
中使用时会出错

但是您的代码甚至不应该走那么远,因为在
TermWorker
类中,您正在将
postag\u labels
属性初始化为空数组。请记住,数组被强制转换为
线程化
对象上的
Volatile
对象(扩展了
Worker
对象)。这意味着该属性是
线程类的
Volatile
对象,使其不可变。因此,当您尝试初始化一个新的
PostagJob
对象时,它应该会失败,并出现一个不变性冲突错误。删除数组的属性初始化并执行上述强制转换(在上一段中)应该可以解决此问题

因此,为了使其正常工作,您必须继续使用数组,这意味着每当将数组分配给
线程化
对象的属性时,都要使用显式转换

尝试解决上述问题,然后让我知道,如果有些东西仍然不工作。(如果你能用一个小的、再现你的问题的例子来更新你的原始文章,那将是非常感激的,因为在代码库中跋涉需要花费太多的时间。)