Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 27, 2015 01:55:57

yum
Зарегистрирован: 2015-10-27
Сообщения: 6
Репутация: +  0  -
Профиль  

Требуется помощь в реализации многопоточного скрипта

Здравствуйте!
Есть 2 функции, 1я получает данные, 2я работает с ними. 2я функ. ждёт данные от первой, после чего начинает работать с ними. Всё это происходит в многопоточном режиме(~100 потоков), постоянно. Но если вторая функция работает с макс. количеством потоков(которое было установлено), первая должна приостановится на время, ждать пока освободится поток у 2й.
Надеюсь получилось объяснить..) Буду рад простому примеру.

Отредактировано yum (Окт. 27, 2015 02:01:09)

Офлайн

#2 Окт. 27, 2015 02:58:34

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Требуется помощь в реализации многопоточного скрипта

Вам подходит концепция очереди. Первая функция наполняет очередь, N потоков функций 2 получают задачу из очереди, если задач нет, ждут когда появится.
Но тут есть важный ньюанс, если вы за счет многопоточности хотите получить выигрышь в производительности в сложных для CPU задачах (все то что способно его максимально нагрузить ), то вы этого не добьетесь из за GIL (глобальной блокировки). В таком случае вам надо не много поточность, а многопроцессность. Т.е. когда порождаются не потоки, а процессы.

За многопоточность отвечает модуль threading, за многопроцессность multiprocessing. В зависимости от выбора существует разные очередию Для первого случая есть отдельный модуль Queue (Вот тут на него можно посомтреть с примерами). Для второго случая в самом модуле есть Queue класс или пакет.

Так же можно посмотреть в сторону Celery, в случае если вам надо что то наподобие сервиса который должен работать всегда



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Ноя. 5, 2015 19:34:24

yum
Зарегистрирован: 2015-10-27
Сообщения: 6
Репутация: +  0  -
Профиль  

Требуется помощь в реализации многопоточного скрипта

Спасибо JOHN! Разобрался, но не совсем, есть пару вопросов..
Если делать как в первом примере - q = Queue(1) то, как только задействованы все потоки, очередь делает ещё один проход и ждёт уже с новыми данными, пока освободится поток.(при таком раскладе данные становятся не актуальными). Вопрос, как запускать очереть именно после того как освободился поток.
Второй вопрос, как сделать таймер для потока? (максимальное время выполнения, например не более 3мин. те. вызвать тайм.исключение)

Отредактировано yum (Ноя. 5, 2015 19:46:54)

Офлайн

#4 Ноя. 5, 2015 20:00:25

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Требуется помощь в реализации многопоточного скрипта

Я не хочу лезть не со своими советами, но можете глянуть на досуге в сторону RQ. Там есть и время выполнения и выполнения таска можно вязать с другим таском… Работает поверх redis, к слову.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version