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, как реализовать?
Мне нужно реализовать таймаут у потока, если программа, которую он выполняет зависла, например более чем на 60 секунд. Как это сделать? Еще не понятно почему, у меня $workers[$i]->kill(); возвращает false. В чем может быть проблема? Спасибо
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Не нужно вообще раскалупывать этот полурабочий овощ на обдутом матрасе.
Есть куча межОСевых проблем с тредами пых-пыха, кроме того, он еще и не умеет все, что должны уметь треды, тем более по POSIX-стандартам (как минимум join, detach, SIG_*).
Отсюда вытекает следующая архитектура:
1) Запускать не потоки, а процессы, хош через exec() хош через что, передавая нужные параметры запускаемым процессам.
2) Для общих данных между этими процессами (мы же имитируем потоки, да?) можно, и даже нужно, использовать shared memory + semaphores. Но! Будь осторожен: у пых-пыха есть две реализации шареда, одна - только его внутреняя "виртуальная" и никакие внешние процессы не смогут увидеть и прочитать из неё, что либо, точнее прочитать то прочитают, но там будет пыхо-опкод какой-то, вторая - реальная, которая выделяет реальный кусок памяти и туда можно писать-читать межпроцессно! всякую бинарщину.
Если же по каким-то причинам шаред будет не доступен (как модуль апача, не кли, не цги), можешь погонять данные между процесами тупо через файлы и их эксклюзивную пыхоблокировку LOCK_EX/LOCK_UN. Блокировка файла в целом сымитирует семафоры для шареда.
3) Управлять всеми этими "потоками" ты будешь из главного скрипта, его кстати можно и не крутить постоянно в бесконечном цикле, а так, зашел, спросил статус, выполнил действие.
Как узнать что "поток" сдох? Пусть новый "поток" пишет в шаред или файл что он начал свою работу (ессно + время старта + PID + другая хрень по желанию), а по окончании - удаляет из стека себя любимого. Так мониторный скрипт сможет увидеть, что "поток" сдох, узнав что запись трудоголика не удалена, т.е. даже с PID-файлами можно будет не заморачиваться - пусть "потоки" пишут о себе прямо в шаред или файл.
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Или Gearman
freelsd
Отправлено: 12 Апреля, 2015 - 07:28:07
Гость
Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015
Помог: 1 раз(а)
DeepVarvar пишет:
Не нужно вообще раскалупывать этот полурабочий овощ на обдутом матрасе.
Есть куча межОСевых проблем с тредами пых-пыха, кроме того, он еще и не умеет все, что должны уметь треды, тем более по POSIX-стандартам (как минимум join, detach, SIG_*).
Отсюда вытекает следующая архитектура:
1) Запускать не потоки, а процессы, хош через exec() хош через что, передавая нужные параметры запускаемым процессам.
2) Для общих данных между этими процессами (мы же имитируем потоки, да?) можно, и даже нужно, использовать shared memory + semaphores. Но! Будь осторожен: у пых-пыха есть две реализации шареда, одна - только его внутреняя "виртуальная" и никакие внешние процессы не смогут увидеть и прочитать из неё, что либо, точнее прочитать то прочитают, но там будет пыхо-опкод какой-то, вторая - реальная, которая выделяет реальный кусок памяти и туда можно писать-читать межпроцессно! всякую бинарщину.
Если же по каким-то причинам шаред будет не доступен (как модуль апача, не кли, не цги), можешь погонять данные между процесами тупо через файлы и их эксклюзивную пыхоблокировку LOCK_EX/LOCK_UN. Блокировка файла в целом сымитирует семафоры для шареда.
3) Управлять всеми этими "потоками" ты будешь из главного скрипта, его кстати можно и не крутить постоянно в бесконечном цикле, а так, зашел, спросил статус, выполнил действие.
Как узнать что "поток" сдох? Пусть новый "поток" пишет в шаред или файл что он начал свою работу (ессно + время старта + PID + другая хрень по желанию), а по окончании - удаляет из стека себя любимого. Так мониторный скрипт сможет увидеть, что "поток" сдох, узнав что запись трудоголика не удалена, т.е. даже с PID-файлами можно будет не заморачиваться - пусть "потоки" пишут о себе прямо в шаред или файл.
Аглы?
Спасибо конечно, что подробно расписал, но во-первых я нубас, и мне придется подробно по каждому пункту перечитывать маны. А во-вторых, не хотелось бы еще такие костыли сколачивать. Хотелось бы понять что не так и исправить.
LIME пишет:
Или Gearman
Вроде какое-то громоздкое решение, не? Мне в общем-то тривиальную довольно задачу нужно решить, посему хотелось бы максимально простыми способами.
DeepVarvar
Отправлено: 12 Апреля, 2015 - 10:35:35
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Ыыыы... Ну вот еще одна идея либу написать, которую сам тут расписал. Жаль только времени нет нафига..
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.