Найти - Пользователи
Полная версия: Требуется помощь в реализации многопоточного скрипта
Начало » Центр помощи » Требуется помощь в реализации многопоточного скрипта
1
yum
Здравствуйте!
Есть 2 функции, 1я получает данные, 2я работает с ними. 2я функ. ждёт данные от первой, после чего начинает работать с ними. Всё это происходит в многопоточном режиме(~100 потоков), постоянно. Но если вторая функция работает с макс. количеством потоков(которое было установлено), первая должна приостановится на время, ждать пока освободится поток у 2й.
Надеюсь получилось объяснить..) Буду рад простому примеру.
JOHN_16
Вам подходит концепция очереди. Первая функция наполняет очередь, N потоков функций 2 получают задачу из очереди, если задач нет, ждут когда появится.
Но тут есть важный ньюанс, если вы за счет многопоточности хотите получить выигрышь в производительности в сложных для CPU задачах (все то что способно его максимально нагрузить ), то вы этого не добьетесь из за GIL (глобальной блокировки). В таком случае вам надо не много поточность, а многопроцессность. Т.е. когда порождаются не потоки, а процессы.

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

Так же можно посмотреть в сторону Celery, в случае если вам надо что то наподобие сервиса который должен работать всегда
yum
Спасибо JOHN! Разобрался, но не совсем, есть пару вопросов..
Если делать как в первом примере - q = Queue(1) то, как только задействованы все потоки, очередь делает ещё один проход и ждёт уже с новыми данными, пока освободится поток.(при таком раскладе данные становятся не актуальными). Вопрос, как запускать очереть именно после того как освободился поток.
Второй вопрос, как сделать таймер для потока? (максимальное время выполнения, например не более 3мин. те. вызвать тайм.исключение)
4kpt_III
Я не хочу лезть не со своими советами, но можете глянуть на досуге в сторону RQ. Там есть и время выполнения и выполнения таска можно вязать с другим таском… Работает поверх redis, к слову.
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