Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Таймаут потока PThreads, как реализовать?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
freelsd
Отправлено: 11 Апреля, 2015 - 15:27:21
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




У меня есть такой код:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. /**
  4. * Author: Abu Ashraf Masnun
  5. * URL: http://masnun.me
  6. */
  7. //define("TMT",3);
  8.  
  9. class WorkerThreads extends Thread
  10. {
  11.     private $workerId;
  12.  
  13.     public function __construct($string)
  14.     {
  15.         $this->command_string = trim($string);
  16.     }
  17.  
  18.     public function run()
  19.     {
  20.                                        
  21.         echo $this->command_string." ".Thread::getCurrentThreadId()."\n";
  22.                 //sleep(rand(0, 3));
  23.                 $str = "C:\\Users\\Alex\\Desktop\\2web\\phantom\\phantomjs.exe C:\\Users\\Alex\\Desktop\\2web\\test.js ";
  24.                
  25.                 $url = $this->command_string;
  26.                 $d = explode("://",$url);
  27.                 $ex_str = $str." ".$url." > ".$d[1].".html";
  28.                 //$ex_str = $str." ".$url;
  29.                 //echo $ex_str;
  30.                 //$ex_str =  escapeshellarg($ex_str);
  31.                 //echo $ex_str;
  32.                
  33.                 exec($ex_str, $out);
  34.        
  35.                 //print_r($out);
  36.     }
  37. }
  38.  
  39. //$data = file('sites.txt');
  40. $data_f = file('sites_x.txt');
  41. print_r($data_f);
  42. $data = array();
  43. $data_size = count($data_f);
  44. for($i = 0;$i<$data_size;$i++)
  45. {
  46.         $info = explode(";",trim($data_f[$i]));
  47.         if($info[1] === 'y')
  48.                 continue;
  49.         $data[] = $info[0];
  50. }
  51. print_r($data);
  52. $data_size = count($data);
  53. // Worker pool
  54. $workers = [];
  55. $t_count = 4;
  56. $flag = 1;
  57. $k = 0;
  58. //echo "$data_size";
  59.  
  60. while($flag === 1)
  61. {      
  62.        
  63.        
  64.         /*
  65.         //echo "$k\n";
  66.         if($k >= $data_size)
  67.         {      
  68.                 //echo "111"; exit();
  69.                 $flag = 0;
  70.                 break 2;
  71.         }
  72.         */
  73.         $c_w = count($workers);
  74.  
  75.         if($c_w < $t_count)
  76.         {
  77.                 for($i = $c_w; $i<$t_count - $c_w;$i++)
  78.                 {
  79.                         if($k >= $data_size)
  80.                         {
  81.                                 $flag = 0;
  82.                                 break;
  83.                         }      
  84.                        
  85.                         $workers[$i] = new WorkerThreads($data[$k]);
  86.                         //echo $data[$k]."\n";
  87.                         echo "worker $i started\n";
  88.                         $workers[$i]->start();
  89.                         $k++;  
  90.                 }
  91.        
  92.         }
  93.  
  94.         $c_w = count($workers);
  95.         for($i=0;$i<$c_w;$i++)
  96.         {
  97.                        
  98.                         $workers[$i]->kill();
  99.                         unset($workers[$i]);
  100.                         echo "unset $i\n";
  101.                         //var_dump($workers[$i]->isTerminated(), $workers[$i]->getTerminationInfo());
  102.                         /*
  103.                         if($workers[$i]->join())
  104.                         {
  105.                                 //var_dump($workers[$i]->isTerminated(), $my->getTerminationInfo());
  106.                                 echo "joining $i\n";
  107.                                 unset($workers[$i]);
  108.                                
  109.                         }
  110.                         */
  111.         }
  112.        
  113.  
  114. }
  115.  
  116. ?>


Мне нужно реализовать таймаут у потока, если программа, которую он выполняет зависла, например более чем на 60 секунд. Как это сделать? Еще не понятно почему, у меня $workers[$i]->kill(); возвращает false. В чем может быть проблема? Спасибо

(Отредактировано автором: 11 Апреля, 2015 - 15:39:35)

 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Апреля, 2015 - 00:24:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Не нужно вообще раскалупывать этот полурабочий овощ на обдутом матрасе.
Есть куча межОСевых проблем с тредами пых-пыха, кроме того, он еще и не умеет все, что должны уметь треды, тем более по POSIX-стандартам (как минимум join, detach, SIG_*).
Отсюда вытекает следующая архитектура:

1) Запускать не потоки, а процессы, хош через exec() хош через что, передавая нужные параметры запускаемым процессам.

2) Для общих данных между этими процессами (мы же имитируем потоки, да?) можно, и даже нужно, использовать shared memory + semaphores. Но! Будь осторожен: у пых-пыха есть две реализации шареда, одна - только его внутреняя "виртуальная" и никакие внешние процессы не смогут увидеть и прочитать из неё, что либо, точнее прочитать то прочитают, но там будет пыхо-опкод какой-то, вторая - реальная, которая выделяет реальный кусок памяти и туда можно писать-читать межпроцессно! всякую бинарщину.

Если же по каким-то причинам шаред будет не доступен (как модуль апача, не кли, не цги), можешь погонять данные между процесами тупо через файлы и их эксклюзивную пыхоблокировку LOCK_EX/LOCK_UN. Блокировка файла в целом сымитирует семафоры для шареда.

3) Управлять всеми этими "потоками" ты будешь из главного скрипта, его кстати можно и не крутить постоянно в бесконечном цикле, а так, зашел, спросил статус, выполнил действие.

Как узнать что "поток" сдох? Пусть новый "поток" пишет в шаред или файл что он начал свою работу (ессно + время старта + PID + другая хрень по желанию), а по окончании - удаляет из стека себя любимого. Так мониторный скрипт сможет увидеть, что "поток" сдох, узнав что запись трудоголика не удалена, т.е. даже с PID-файлами можно будет не заморачиваться - пусть "потоки" пишут о себе прямо в шаред или файл.

Аглы?
 
 Top
LIME
Отправлено: 12 Апреля, 2015 - 06:28:36
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Или Gearman
 
 Top
freelsd
Отправлено: 12 Апреля, 2015 - 07:28:07
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




DeepVarvar пишет:
Не нужно вообще раскалупывать этот полурабочий овощ на обдутом матрасе.
Есть куча межОСевых проблем с тредами пых-пыха, кроме того, он еще и не умеет все, что должны уметь треды, тем более по POSIX-стандартам (как минимум join, detach, SIG_*).
Отсюда вытекает следующая архитектура:

1) Запускать не потоки, а процессы, хош через exec() хош через что, передавая нужные параметры запускаемым процессам.

2) Для общих данных между этими процессами (мы же имитируем потоки, да?) можно, и даже нужно, использовать shared memory + semaphores. Но! Будь осторожен: у пых-пыха есть две реализации шареда, одна - только его внутреняя "виртуальная" и никакие внешние процессы не смогут увидеть и прочитать из неё, что либо, точнее прочитать то прочитают, но там будет пыхо-опкод какой-то, вторая - реальная, которая выделяет реальный кусок памяти и туда можно писать-читать межпроцессно! всякую бинарщину.

Если же по каким-то причинам шаред будет не доступен (как модуль апача, не кли, не цги), можешь погонять данные между процесами тупо через файлы и их эксклюзивную пыхоблокировку LOCK_EX/LOCK_UN. Блокировка файла в целом сымитирует семафоры для шареда.

3) Управлять всеми этими "потоками" ты будешь из главного скрипта, его кстати можно и не крутить постоянно в бесконечном цикле, а так, зашел, спросил статус, выполнил действие.

Как узнать что "поток" сдох? Пусть новый "поток" пишет в шаред или файл что он начал свою работу (ессно + время старта + PID + другая хрень по желанию), а по окончании - удаляет из стека себя любимого. Так мониторный скрипт сможет увидеть, что "поток" сдох, узнав что запись трудоголика не удалена, т.е. даже с PID-файлами можно будет не заморачиваться - пусть "потоки" пишут о себе прямо в шаред или файл.

Аглы?


Спасибо конечно, что подробно расписал, но во-первых я нубас, и мне придется подробно по каждому пункту перечитывать маны. А во-вторых, не хотелось бы еще такие костыли сколачивать. Хотелось бы понять что не так и исправить.

LIME пишет:

Или Gearman


Вроде какое-то громоздкое решение, не? Мне в общем-то тривиальную довольно задачу нужно решить, посему хотелось бы максимально простыми способами.
 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Апреля, 2015 - 10:35:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Ыыыы... Ну вот еще одна идея либу написать, которую сам тут расписал. Жаль только времени нет нафига..
 
 Top
freelsd
Отправлено: 12 Апреля, 2015 - 11:45:48
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


Помог: 1 раз(а)




DeepVarvar пишет:
Ыыыы... Ну вот еще одна идея либу написать, которую сам тут расписал. Жаль только времени нет нафига..

А есть какие-нибудь мысли почему kill() может не работать?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB