[У меня есть приложение 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
Как реализовать Queuehandler и Queuelistener на фабрике Flask Factory ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение