maximkv25
@maximkv25
web-developer

Как правильно работать с потоками в python?

Приветствую, немного пользовался потоками, но не хватает окончательного понимания как с ними совладать.
python3 + django 1.9
При старте сервака стартует 1 главный поток и с него 2 дочерних, как это выглядит
def scheduled():
    while True:
        # выполняется некоторая фильтрация по бд в итоге получаем список send, который передаем дочернему потоку
        t2 = threading.Thread(target=sending, args=[send])
        t2.start()
        t3 = threading.Thread(target=statistics)
        t3.start()

t = threading.Thread(target=scheduled)
t.start()


Все это работает, может правда и холиварно написано.
Вся эта штука варится, но когда происходит пул нового кода или вручную перезапускаю сервак, подсчеты, которые выполняются в потоках сбиваются и выдают ужасающие показатели, в основном это сбор статистики.

  1. Можно ли безопасно остановить выполнение потоков? Чтобы данные которые обрабатываются корректно сохранились.
  2. Так же рассматривал другие варианты реализации, вынести в отдельный процесс, а возможно и в отдельный мини проект, который будет заниматься сбором статистики.

Цель: Избежать неверных вычислений.
Вообщем что посоветуете дорогие гуру?
  • Вопрос задан
  • 802 просмотра
Решения вопроса 1
maximkv25
@maximkv25 Автор вопроса
web-developer
Изучив более подробно материалы о потоках, прислушавшись к советам, решена задача довольно таки просто.

Скрипт будет запускаться через manage.py, так не придется переписывать текущий функционал и при таком запуске будет создан отдельный процесс в системе, запустим в фоне с помощью surepvisord/systemd.

import threading
import time


def example(name ,event):
	i = 0
	while event.is_set():
		print('Thread: %s, %d', % (t1.name, i))
		i += 1
		time.sleep(10)


try:
	event = threading.Event()
	event.set()
	t1 = threading.Thread(target=example, args=('first', event))
	t1.start()
except KeyboardInterrupt:
	event.clear()
	t1.join()


Чтобы корректно завершать все это дело, напишем скрипт для вброса исключения, после чего event изменит флаг и потоки будут завершены.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@maxfox
Я не знаю, что у вас за задача, но лучше используйте Celery или другие подобные инструменты.
Ответ написан
@Eugen_p
Вот крутое видео об потоках процессах от Д. Бизли. Где-то даже был перевод на русский.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы