У меня есть PHP-код, который вызывает около 100 потоков одновременно, каждый поток выбирает одну HTML-страницу и анализирует ее, используя Простой HTML DOM Parser для определенной информации.
Вот код
//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 из них без успешного извлечения и анализа данных.
Мой код использует класс, который расширяет поток.
Хорошо, я попытаюсь направить вас в правильном направлении.
Из того, что я знаю о потоках 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 и на php.net — есть много примеров, показывающих, как синхронизироваться с потоком и проверять его состояние выполнения. Вы также можете поделиться объектами, которые происходят от Threaded
между потоками, что позволяет создать поток Work Sink, который создает другие 100, или он может принимать другие 100 потоков через конструктор. У вас есть много вариантов: от использования пула потоков, который поставляется с pthreads, до написания собственного кода и т. Д.
Других решений пока нет …