Найти - Пользователи
Полная версия: Потоки
Начало » Python для новичков » Потоки
1 2
CommonUser
Здравствуйте,

подскажите, как реализовать следующее:

- породить несколько потоков (задач), которые выполняют некую работу
- создать что-то типа менеджера/монитора, который через некоторое время будет проверять состояния потоков и если один из них умер (скажем произошла ошибка в таске), сообщал об этом, но не переставал опрашивать “выживших”
- менеджер должен иметь механизм, который терминирует все опрашиваемые таски.

Что лучше использовать для этих целей?
- threading
- subprocess
- multiprocessing
plusplus
Потоки для каких целей нужны? Если для вычислительных, то они не помогут из-за GIL, надо использовать multiprocessing. subprocess - это вообще по-моему для запуска сторонних приложений.
warik
Subprocess это совсем не то, как сказали выше.
А вот на счет multiprocessing могу сказать, что это платформо зависимая штука. И если у Вас не никсы, то могут возникнуть трудности с передачей объектов в процессы (они должны быть сериализируемы).

Если задача стоит чисто в абстрактом менеджере процессов, без прироста производительности, то трэды отлично подходят.
CommonUser
У меня несколько устройств, которые мне нужно опрашивать. Использую ubuntu. Производительность в моей задаче особо не нужна.
plusplus
CommonUser
У меня несколько устройств, которые мне нужно опрашивать. Использую ubuntu. Производительность в моей задаче особо не нужна.

Посмотри вот такой вариант:
https://bitbucket.org/lorien/grab/src/760bc46b7442331fa890681c55eb846c2b764b47/grab/tools/work.py?at=default
Потоки порождает, из-за exception-ов не зависает, механизма завершения потоков у него нет, но в принципе меня устраивало просто прерывать работу функции make_work.
CommonUser
Я в пайтоне недавно, и код не совсем понимаю, по крайней мере не увидел локов, мутексов и тд.


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
CommonUser
Я в пайтоне недавно, и код не совсем понимаю, по крайней мере не увидел локов, мутексов и тд.
Есть Queue, внутри них используются локи. Код да, странный, я не обращал внимания на параметры).
Видимо тут автор просмотрел это, а так параметры всё равно глобально передаются, то всё так и осталось работать.
CommonUser
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
http://docs.python.org/2/library/queue.html

Да, прочитал, это thread-safety queue
CommonUser

Скажите пожалуйста, как создать новый поток и использовать его несколько раз, то есть запускать, а не создавать снова. Python 2.7
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB