Каков наилучший способ представить интерфейс фляги для текущей фоновой задачи?
У меня длительный процесс, который непрерывно читается из 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
Я думаю, можно было бы использовать сельдерей для такого рода заданий, которые находятся в фоновом режиме, а также периодически запускаются в определенное время.
Задачи на основе сельдерея