Задать вопрос
@Scorpiored88

Как правильно задействовать очереди в Flask python?

Всем доброго! Подскажите пожалуйста как правильно использовать очереди в связке с Flask.
Я вроде как то и ррикрутил их к своему Flask серверу, но не уверен, что правильно.

Вот пример моей реализации:

from Queue import Queue
import threading
from flask import Flask


class Sender(object):
    def send(self):
        # sending...
        return "sended"




senderManager = Sender()


app = Flask(__name__)


q = Queue()
t = threading.Thread(target=q_worker)
t.setDaemon(True)
t.start()

def send_command(item):
    senderManager.send(item)


def q_worker():
    while True:
        item = q.get()
        send_command(item)
        q.task_done()






@app.route("/action", methods=['POST'])
def action():
    item = request.json['item']
    q.put(item)

    return "added to q"

q.join()

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=port)


Нужно чтобы при получения запроса на /action, отправить действия через метод send (отправка команды на железо) класа Sender, процес которого занимает некоторое время, и если не дождатся его выполнения и вызвать этот метод снова (при получении очередного POST запроса), новый sender не отработает корректно, так как железо, на которое была отправлена предыдущая команда, еще не закончило работу, и новая команда будет просто не выполнена. Поетому нужно, чтобы при получении нескольких POST запросов подряд, создавалась очередь, и постепенно выполнялся новый Sender.send из этой очереди, только после выполнения предыдущего.
P.S. Особенно не уверен в месте расположения q.join()
  • Вопрос задан
  • 915 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@dmtrrr
Backend developer
Если у вас будет больше одного процесса с Flask приложением (а так скорее всего и должно быть), то у каждого процесса будет своя очередь, и все это будет работать не так, как вам нужно.
Самый простой способ писать события в БД, и скрипт по крону будет отправлять команды железу.
Если по скорости такой вариант не подходит, смотрите в сторону RabbitMQ
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы