2017-07-15 17 views
0

我使用Pthread和PHP 7构建了一个TermWorker类的Pool。我从数据库源中选择了几个术语,并且我想用特定的Jobs来处理它。这是我的代码,这样做的:使用Pthread/PHP从作业获取Worker数据

//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, 我用一个阵列合并对于这一点,和我设置状态,请参阅:

//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的作业中,我做了几个分类, ,但我也想使用保存的postag_labels(来自worker)。 目前我使用一个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上的回购:https://github.com/KSART-nl/terma

回答

0

对于数组在pthread中的处理方式以及pthread的不变性语义的一些问题,似乎存在一些误解。

当它们被分配到Threaded对象的属性时,将数组转换为Volatile对象。这意味着array_merge调用内部的(array)不需要。假设从array_merge返回一个数组,如果您希望将结果保留为数组(我怀疑您会这样做),那么您应该明确地将其转换为数组。你PostagJob::__construct方法

看,你是不是铸造$payloadtermArray是一个数组,所以它会成为一个Volatile对象。这是有问题的,因为稍后在array_merge内部使用时会出错。

但是你的代码甚至不应该这么做,因为在TermWorker类中,你正在初始化postag_labels属性为空数组。请记住,阵列会在Threaded对象(其中Worker扩展)上铸造到Volatile对象。这意味着该属性是Threaded类的Volatile对象,因此它不可变。因此,当您尝试初始化新的PostagJob对象时,它应该会因不可变性违规错误而失败。删除对数组的属性初始化并执行上述转换(在前一段中)应该可以解决此问题。

所以为了这个工作,你必须留在使用数组,这意味着每当一个数组被分配到一个Threaded对象的属性时使用显式转换。

尝试修复上述问题,然后让我知道是否仍然无法正常工作。 (更新您的原始帖子,以更小的再现问题的例子将会非常感激,因为跋涉通过代码库需要太多时间。)