我有一个PHP代码,它同时调用大约100个线程,每个线程获取一个HTML页面并使用简单HTML DOM解析器解析它以获取某些信息。
这是代码
//some code, including a loop to generate counter for thread
$thread[$counter] = new fetch($link);
$thread[$counter]->start();
foreach($thread as $t){
if($t->join()){
//do something
}//if
}//foreach
以下是为每个线程执行的代码。
public function run(){
$content = file_get_html("http:blahblabha");
foreach($content->find('something') as $TL)
$this->var = $TL->xmltext;
}//run
但是,虽然我可以使用join()
方法验证线程是否完整,但是在100个线程中,它会返回大约95个线程的数据和5个完整的线程,而不会成功获取和解析数据。
我的代码使用扩展Thread的类。
答案 0 :(得分:1)
好的,我会试图引导你朝着正确的方向前进。
根据我对posix线程的了解,pthread_join()
暂停调用上下文,直到引用的线程终止。一旦完成,分配给该线程的任何资源都将被释放 - 任何有更好理解的人,请在此纠正我。
现在,这与你想要的相反。你想要什么,如果我错了也纠正我,是你想要知道所有线程是否完成而且你不想阻止100中的每一个 - 这使得一切都是同步的。
您可能需要的是一种类型化的系统。这意味着您的代码如下所示:
fire up 100 threads
do work in each thread
when all 100 are done, consider the processing finished
如果我是你,我会创造100个线程+ 1个。这1个额外的线程将激活线程并在完成工作后收集数据。那个1,我们称之为Work sink
,将是你的主要上下文所说的线程,一旦完成该线程,你的100个线程就完成了工作。现在,根据我的有限知识,你不加入一个线程来检查它的状态。您可以与它同步并检查成员的状态,该状态可以告诉您它是否仍在工作。
至于如何来编码所有这些,从我在官方git repo和php.net上看到的 - 有很多例子展示了如何与线程同步并检查其执行状态。您还可以在线程之间共享从Threaded
下降的对象,这样就可以创建Work Sink线程来创建另外100个线程,或者它可以通过构造函数接受其他100个线程。这里有很多选择,从使用pthreads附带的线程池到编写自己的线程池等。