gpt4 book ai didi

python - Gunicorn Django 线程

转载 作者:行者123 更新时间:2023-11-28 17:41:08 31 4
gpt4 key购买 nike

我找不到有关 Gunicorn/Django 进程/线程生命周期的文档。

假设在 process_response() 中间件 Hook 期间生成了一个守护线程。 AFAIK 此线程不会阻止 HTTP 响应。但是,它会阻塞生成它的线程吗?在工作进程准备好处理另一个请求之前,Gunicorn 是否会等待此线程完成将其加入主线程,还是会分离此线程?

data_collection/tasks.py:

from celery import shared_task

@shared_task(ignore_result=True)
def add_event(event_name, event_body):
...
client.add_event(event_name, event_body)

data_collection/middleware.py:

import threading
from data_collection.tasks import add_event

class DataCollectionMiddleware:
def process_response(self, request, response):
...
thread = threading.Thread(target=add_event.delay, args=("Page_Views", event_body))
thread.setDaemon(True)
thread.start()

更多细节:

我编写了一个自定义中间件类,用于将一些数据发送到外部队列 (RabbitMQ),稍后由 celery worker 异步检索和处理这些数据。我不希望这个在线排队调用阻止客户端的响应,所以我将该函数 (add_event.delay()) 包装在一个“守护进程”线程中(la http://www.artfulcode.net/articles/threading-django/)。如果出现网络中断并且重试策略有很长的限制,则此线程可能会运行很长时间。在那种情况下,这些线程会阻塞我的 Gunicorn 工作进程吗?

我读了这个问题,但我不确定我的线程是否干扰了“Worker's main loop”: Danger to having long lasting (non-deamon) threads in a Django/Gunicorn app?

最佳答案

没有。从 Gunicorn 工作主线程生成的线程没有什么特别之处。

一旦你生成一个线程,它将并行执行直到完成或死亡。 Gunicorn 不知道这些从工作主线程派生的线程,所以它不会尝试加入它们,因此工作主线程不会等待子线程完成。此外,线程的守护进程没有任何影响;守护进程只是意味着线程不会对进程的“ liveness ”做出贡献,并且会一直运行到进程退出,届时它会被自动杀死。

如果你想在重新使用同一个工作线程之前等待这些线程完成,你必须在 WSGI 应用程序(例如 django.core.handlers.wsgi.WSGIHandler.__call__())返回之前这样做。或者为 Gunicorn 编写一些疯狂的猴子补丁来跟踪子线程。

TL;DR 您绝对可以通过从工作主线程生成长时间运行的子线程来无限制地增长线程。最好保证它们会在超时的时间内完成。

关于python - Gunicorn Django 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24005080/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com