Gunicorn + Flask: порождает поток в каждом рабочем с опцией `preload` - PullRequest
0 голосов
/ 05 января 2020

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

Поэтому мой вопрос: как я могу запустить поток на каждого из рабочих?

...