Форум сайта python.su
Здравствуйте!
Есть 2 функции, 1я получает данные, 2я работает с ними. 2я функ. ждёт данные от первой, после чего начинает работать с ними. Всё это происходит в многопоточном режиме(~100 потоков), постоянно. Но если вторая функция работает с макс. количеством потоков(которое было установлено), первая должна приостановится на время, ждать пока освободится поток у 2й.
Надеюсь получилось объяснить..) Буду рад простому примеру.
Отредактировано yum (Окт. 27, 2015 02:01:09)
Офлайн
Вам подходит концепция очереди. Первая функция наполняет очередь, N потоков функций 2 получают задачу из очереди, если задач нет, ждут когда появится.
Но тут есть важный ньюанс, если вы за счет многопоточности хотите получить выигрышь в производительности в сложных для CPU задачах (все то что способно его максимально нагрузить ), то вы этого не добьетесь из за GIL (глобальной блокировки). В таком случае вам надо не много поточность, а многопроцессность. Т.е. когда порождаются не потоки, а процессы.
За многопоточность отвечает модуль threading, за многопроцессность multiprocessing. В зависимости от выбора существует разные очередию Для первого случая есть отдельный модуль Queue (Вот тут на него можно посомтреть с примерами). Для второго случая в самом модуле есть Queue класс или пакет.
Так же можно посмотреть в сторону Celery, в случае если вам надо что то наподобие сервиса который должен работать всегда
Офлайн
Спасибо JOHN! Разобрался, но не совсем, есть пару вопросов..
Если делать как в первом примере - q = Queue(1) то, как только задействованы все потоки, очередь делает ещё один проход и ждёт уже с новыми данными, пока освободится поток.(при таком раскладе данные становятся не актуальными). Вопрос, как запускать очереть именно после того как освободился поток.
Второй вопрос, как сделать таймер для потока? (максимальное время выполнения, например не более 3мин. те. вызвать тайм.исключение)
Отредактировано yum (Ноя. 5, 2015 19:46:54)
Офлайн
Я не хочу лезть не со своими советами, но можете глянуть на досуге в сторону RQ. Там есть и время выполнения и выполнения таска можно вязать с другим таском… Работает поверх redis, к слову.
Офлайн