Каков наилучший способ представить интерфейс фляги для текущей фоновой задачи?

У меня длительный процесс, который непрерывно читается из telnet-порта и может иногда писать на него. Иногда я хочу отправить ему HTTP-запрос, чтобы получить информацию, прочитанную с момента последнего запроса. Иногда я могу отправить HTTP-запрос для записи определенных данных в другой telnet-порт.

Должен ли я сделать это с помощью двух потоков, и если это так, я должен использовать мьютекс или очередь команд. Как вы все-таки нанизаны на колбу? Должен ли я использовать многопроцессорность? Что-то еще?

Причина, по которой я прошу об этом, - это проблема с аналогичной проблемой (но последовательные порты вместо telnet-порта и непосредственно в приложении вместо локальной/удаленной HTTP-службы), и в конечном итоге поток данных, не содержащих данные, почти никогда не был даже когда я вставил тонны вызовов сна. Я закончил переписывать его с мьютекса на очереди, а затем на использование многопроцессорных w/queues.

Изменить: порты telnet - это соединения с приложением, которое передает (в основном, считывает данные отладки) с помощью аппаратного обеспечения (принтера). К HTTP-службе флэша, которую я хочу написать, будет доступен при тестировании, выполняющемся против принтера (либо на том же компьютере, либо на другом компьютере, а затем на HTTP-службе), ни одна из них не связана с веб-браузером!

Ответ 1

Такие длительные опросы лучше всего использовать с помощью сокетов, они действительно не соответствуют модели Flask/WSGI, поскольку это не связано с асинхронными операциями. Вы можете посмотреть на скрученный или торнадо.

Тем не менее ваш фоновый процесс, который читает/записывает в telnet, может работать в отдельном потоке, который может быть инициирован или не может быть инициирован из HTTP-запроса. После того, как вы начнете поток из флеш-приложения, он не будет блокировать ответ.

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

Ответ 2

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

Вы должны использовать сервер, который вы используете, для запуска приложения Flask, когда вы думаете о потоковой передаче. Сервер dev, который вы получаете при запуске app.run(), представляет собой единый синхронный процесс, который может обрабатывать один запрос за раз. Развертывание приложения Flask на многопоточном сервере, таком как Gunicorn, позволит вам в основном иметь процесс для каждого работника. То есть 4 сотрудника на 4 потоках смогут обрабатывать 4 одновременных запроса.

Каждый запрос Flask получает собственный поток локального объекта для запросов и данных сеанса, поэтому подумайте об этом, когда вы разрабатываете свой код. Не только очередь сообщений хороша для обмена сообщениями между Flask и вашим длительным процессом, но и между вашими индивидуальными потоками Flask.

Теперь, когда мы рассмотрели потоки, позвольте говорить о очередях сообщений. Есть несколько различных шаблонов, которые вы можете использовать здесь, но я сосредоточусь на pub-sub. Модель издателя-подписчика отлично подходит для того, когда данные должны перетекать из одного места в другое. Позвольте назвать долговременный процесс A, а поток или несколько потоков, запускающих приложение Flask B (крутая часть about pub-sub - это то, что любой из них будет работать).

B может "подписаться" на сообщения, идущие от A до очереди, которые A может отправлять в очередь, когда это необходимо. Очередь может "публиковать" сообщения для подписчиков либо путем нажатия на них сообщений, либо ожидания их вывода из очереди. Хорошим решением с Flask может быть проверка очереди на новые сообщения в начале каждого запроса. Вы также можете опубликовать B в аналогичным образом.

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

Ответ 3

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

Задачи на основе сельдерея