Какая оптимальная структура сетевого многопоточного приложения на питоне?

Есть задача написать сетевое приложение.

Сервер на питоне 3.7. К серверу по локалке обращаются клиенты, запросы легкие, дать данные, считать данные. Кроме того сервер просчитывает математику по этим данным. Расчет математики запускается по таймеру с периодом около 100 мс. Время ее расчета довольно большое по времени, до 100-200 мс.

Думаю сделать два потока - в одном математика, в другом ввод/вывод. Использовать для этого asyncio и threading (но это не точно). Опыта написания подобных приложений нет и есть несколько вопросов )

1. Из гугла я понял, что потоки фактически работают не паралельно а по одному. То есть получается что поток с математикой может заблокировать ввод вывод?

2. Вообще интерпретатор переключает когда-нибудь потоки по своей инициативе или обязательно ждет, пока один из потоков остановится сам и только тогда запускает другой ?

3. может время от времени принудительно приостанавливать поток с математикой чтобы пошли потоки с вводом-выводом ? и как это сделать? sleep ()?

4. Или я вообще выбрал неверную структуру, может надо как-то иначе ?
  • Вопрос задан
  • 249 просмотров
Пригласить эксперта
Ответы на вопрос 3
@bacon
Начать с простого, asyncio, который запускает матзадачи через run_in_executor, где executor - ProcessPoolExecutor.
Ответ написан
@dooMoob
1) да
2) интерпретатор сам переключает потоки по таймеру
3) смысла нет, GIL сам разберется
4) математику можно вынести в отдельный процесс(multiprocessing, celery, etc), но тогда надо будет так же добавлять сервис общения между ними
Ответ написан
@qid00000000
Мало что знаю, но информацию найду в гугле
Очень походит на задачу с очередью, погуглите rabbitmq, может поможет вам.

Если у вас linux система, то запускать задание можно по crontab. Обращаю ваше внимание, что если программа будет работать дольше, чем время запуска программы, то вы получите накопление процессов и как итог - нестабильное поведение. Избежать этого, можно настроив задание через flock.

Если расчет происходит в 1 поток, то можно и вовсе обойтись без библиотек мультипроцессинга.
Ответ написан
Ваш ответ на вопрос

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

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