Как реализовать Queuehandler и Queuelistener на фабрике Flask FactoryPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как реализовать Queuehandler и Queuelistener на фабрике Flask Factory

Сообщение Anonymous »

[У меня есть приложение Flask, поставляемое стрельцом, которое порождает несколько потоков и процессов от себя во время запроса. Проблема заключается в том, что при использовании стандартного app.logger некоторые дети попадают в тупик из -за модуля журнала, не способного выпустить блокировку. Это приводит к тому, что эти процессы остаются в памяти на неопределенный срок и становятся проблемой за время прохождения.Thread 371832 (idle): "MainThread"
flush (logging/__init__.py:1009)
emit (logging/__init__.py:1029)
emit (logging/__init__.py:1127)
handle (logging/__init__.py:894)
callHandlers (logging/__init__.py:1586)
handle (logging/__init__.py:1524)
_log (logging/__init__.py:1514)
info (logging/__init__.py:1378)
< /code>
в качестве ссылки я использовал эти удивительные ответы и вопросы < /p>
Как я должен войти в систему при использовании многопроцессы в Python? < /p>
< P> Поддерживает ли многопроцессор ведения журнала Python?import logging
from logging import FileHandler, Formatter
from logging.handlers import QueueHandler, QueueListener
from multiprocessing import Queue
from flask import Flask

log_queue = Queue()

def create_app(app_name="name", **kwargs):
app = Flask(app_name)

# Create a process-safe logging queue
listener = setup_logging(app)
listener.start()

return app

def setup_logging(app: Flask):
logger = app.logger
logger.handlers = []

logger.setLevel(logging.INFO)

queue_handler = QueueHandler(log_queue)
info_handler = FileHandler("info.log")
info_handler.setFormatter(Formatter("%(asctime)s %(levelname)s %(name)s %(threadName)s : %(message)s"))

crit_handler = FileHandler("critical.log")
crit_handler.setLevel(logging.CRITICAL)
crit_handler.setFormatter(Formatter("CRIT\t%(message)s"))

logger.addHandler(queue_handler)
listener = QueueListener(
log_queue, info_handler, crit_handler, respect_handler_level=True
)

return listener
< /code>
Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я отправляю HUP в мастер -процесс для обновления моего кода и некоторых файлов ENV, я получаю эту ошибку < /p>
[2025-02-03 20:48:54 +0200] [51367] [INFO] Hang up: Master
[2025-02-03 20:48:54 +0200] [52751] [INFO] Booting worker with pid: 52751
[2025-02-03 20:48:54 +0200] [52676] [INFO] Worker exiting (pid: 52676)
[2025-02-03 20:48:54 +0200] [52673] [INFO] Worker exiting (pid: 52673)
[2025-02-03 20:48:54 +0200] [52756] [INFO] Booting worker with pid: 52756
Exception in thread Thread-1:
Traceback (most recent call last):
File ".pyenv/versions/3.7.5/lib/python3.7/threading.py", line 926, in _bootstrap_inner
self.run()
File ".pyenv/versions/3.7.5/lib/python3.7/threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File ".pyenv/versions/3.7.5/lib/python3.7/logging/handlers.py", line 1478, in _monitor
record = self.dequeue(True)
File ".pyenv/versions/3.7.5/lib/python3.7/logging/handlers.py", line 1427, in dequeue
return self.queue.get(block)
File ".pyenv/versions/3.7.5/lib/python3.7/multiprocessing/queues.py", line 94, in get
res = self._recv_bytes()
File ".pyenv/versions/3.7.5/lib/python3.7/multiprocessing/connection.py", line 216, in recv_bytes
buf = self._recv_bytes(maxlength)
File ".pyenv/versions/3.7.5/lib/python3.7/multiprocessing/connection.py", line 407, in _recv_bytes
buf = self._recv(4)
File ".pyenv/versions/3.7.5/lib/python3.7/multiprocessing/connection.py", line 383, in _recv
raise EOFError
EOFError
< /code>
Я действительно пытаюсь понять, что здесь происходит. Я предполагаю, что очередь не является пустой во время возрождения работника, и ее убивают. Как мне это решить?

Подробнее здесь: https://stackoverflow.com/questions/794 ... sk-factory
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»