У меня есть простое приложение Flask, которое использует общую очередь: маршрут в приложении помещает содержимое в эту очередь, а отдельный поток-потребитель очищает его. Вот код:
from flask import Flask, request
from queue import Queue
from threading import Thread
app = Flask(__name__)
class QManager:
_queue = Queue()
def qsize(self):
return self._queue.qsize()
def put(self, data):
self._queue.put(data)
def consume_q(self):
while True:
data = self._queue.get()
print(f"Data from queue: {data}")
def start(self):
t = Thread(target=self.consume_q, daemon=True)
t.start()
q_manager = QManager()
q_manager.start()
@app.route("/")
def put_in_q():
data = request.args.get("data", 1)
q_manager.put(data)
return f"{data} added, size of queue: {q_manager.qsize()}"
Этот код отлично работает при непосредственном запуске с Flask. Проблемы начинаются при запуске с Gunicorn: когда я запускаю его без опции preload
, он работает нормально, но с этой опцией поток-потребитель не загружается в рабочих процессах. Я предполагаю, что с опцией preload
поток запускается один раз в главном процессе, и когда рабочие создаются, поток не запускается в них.
Поэтому мой вопрос: как я могу запустить поток на каждого из рабочих?