Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 25, 2013 10:33:57

CommonUser
Зарегистрирован: 2013-02-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки

Здравствуйте,

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

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

Что лучше использовать для этих целей?
- threading
- subprocess
- multiprocessing

Офлайн

#2 Фев. 25, 2013 11:05:13

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

Потоки

Потоки для каких целей нужны? Если для вычислительных, то они не помогут из-за GIL, надо использовать multiprocessing. subprocess - это вообще по-моему для запуска сторонних приложений.



Офлайн

#3 Фев. 25, 2013 14:39:42

warik
Зарегистрирован: 2013-02-06
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Потоки

Subprocess это совсем не то, как сказали выше.
А вот на счет multiprocessing могу сказать, что это платформо зависимая штука. И если у Вас не никсы, то могут возникнуть трудности с передачей объектов в процессы (они должны быть сериализируемы).

Если задача стоит чисто в абстрактом менеджере процессов, без прироста производительности, то трэды отлично подходят.

Офлайн

#4 Фев. 26, 2013 01:36:58

CommonUser
Зарегистрирован: 2013-02-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки

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

Офлайн

#5 Фев. 26, 2013 05:32:04

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

Потоки

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

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



Офлайн

#6 Фев. 26, 2013 06:57:22

CommonUser
Зарегистрирован: 2013-02-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки

Я в пайтоне недавно, и код не совсем понимаю, по крайней мере не увидел локов, мутексов и тд.


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)
Параметры внутри функции не используются.

Офлайн

#7 Фев. 26, 2013 07:09:55

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

Потоки

CommonUser
Я в пайтоне недавно, и код не совсем понимаю, по крайней мере не увидел локов, мутексов и тд.
Есть Queue, внутри них используются локи. Код да, странный, я не обращал внимания на параметры).
Видимо тут автор просмотрел это, а так параметры всё равно глобально передаются, то всё так и осталось работать.



Отредактировано plusplus (Фев. 26, 2013 07:14:33)

Офлайн

#8 Фев. 26, 2013 07:16:35

CommonUser
Зарегистрирован: 2013-02-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки

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, которые берутся из функции выше

Офлайн

#9 Фев. 26, 2013 07:20:31

CommonUser
Зарегистрирован: 2013-02-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки

http://docs.python.org/2/library/queue.html

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

Офлайн

#10 Фев. 27, 2013 10:31:01

CommonUser
Зарегистрирован: 2013-02-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки


Скажите пожалуйста, как создать новый поток и использовать его несколько раз, то есть запускать, а не создавать снова. Python 2.7

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version