CommonUser
Фев. 25, 2013 10:33:57
Здравствуйте,
подскажите, как реализовать следующее:
- породить несколько потоков (задач), которые выполняют некую работу
- создать что-то типа менеджера/монитора, который через некоторое время будет проверять состояния потоков и если один из них умер (скажем произошла ошибка в таске), сообщал об этом, но не переставал опрашивать “выживших”
- менеджер должен иметь механизм, который терминирует все опрашиваемые таски.
Что лучше использовать для этих целей?
- threading
- subprocess
- multiprocessing
plusplus
Фев. 25, 2013 11:05:13
Потоки для каких целей нужны? Если для вычислительных, то они не помогут из-за GIL, надо использовать multiprocessing. subprocess - это вообще по-моему для запуска сторонних приложений.
warik
Фев. 25, 2013 14:39:42
Subprocess это совсем не то, как сказали выше.
А вот на счет multiprocessing могу сказать, что это платформо зависимая штука. И если у Вас не никсы, то могут возникнуть трудности с передачей объектов в процессы (они должны быть сериализируемы).
Если задача стоит чисто в абстрактом менеджере процессов, без прироста производительности, то трэды отлично подходят.
CommonUser
Фев. 26, 2013 01:36:58
У меня несколько устройств, которые мне нужно опрашивать. Использую ubuntu. Производительность в моей задаче особо не нужна.
plusplus
Фев. 26, 2013 05:32:04
CommonUser
У меня несколько устройств, которые мне нужно опрашивать. Использую ubuntu. Производительность в моей задаче особо не нужна.
Посмотри вот такой вариант:
https://bitbucket.org/lorien/grab/src/760bc46b7442331fa890681c55eb846c2b764b47/grab/tools/work.py?at=defaultПотоки порождает, из-за exception-ов не зависает, механизма завершения потоков у него нет, но в принципе меня устраивало просто прерывать работу функции make_work.
CommonUser
Фев. 26, 2013 06:57:22
Я в пайтоне недавно, и код не совсем понимаю, по крайней мере не увидел локов, мутексов и тд.
def task_processor(task_iter, task_queue, limit):
try:
for task in tasks:
taskq.put(task)
finally:
for x in xrange(limit):
taskq.put(STOP)
Параметры внутри функции не используются.
plusplus
Фев. 26, 2013 07:09:55
CommonUser
Я в пайтоне недавно, и код не совсем понимаю, по крайней мере не увидел локов, мутексов и тд.
Есть Queue, внутри них используются локи. Код да, странный, я не обращал внимания на параметры).
Видимо тут автор просмотрел это, а так параметры всё равно глобально передаются, то всё так и осталось работать.
CommonUser
Фев. 26, 2013 07:16:35
processor = Thread(target=task_processor, args=[tasks, taskq, limit])
Эти параметры не используются внутри функции:
def task_processor(task_iter, task_queue, limit):
try:
for task in tasks:
taskq.put(task)
finally:
for x in xrange(limit):
taskq.put(STOP)
но внутри этой вложенной функции используется tasks, taskq, которые берутся из функции выше
CommonUser
Фев. 26, 2013 07:20:31
CommonUser
Фев. 27, 2013 10:31:01
Скажите пожалуйста, как создать новый поток и использовать его несколько раз, то есть запускать, а не создавать снова. Python 2.7