Gunicorn Django线程

时间:2014-06-02 23:53:37

标签: python django multithreading gunicorn

我在找到Gunicorn / Django进程/线程生命周期的文档时遇到了麻烦。

假设在process_response()中间件钩子中生成一个守护程序线程。 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),后来由芹菜工作者异步检索和处理。我不希望这个over-the-wire入队调用阻止客户端的响应,所以我将该函数(add_event.delay())包装在“守护进程”线程(la http://www.artfulcode.net/articles/threading-django/)中。如果网络中断且重试策略有长期限制,则此线程可能会长时间运行。在这种情况下,这些线程会阻止我的Gunicorn工作进程吗?

我读过这个问题,但我不确定我的帖子是否干扰了“工人的主循环”: Danger to having long lasting (non-deamon) threads in a Django/Gunicorn app?

1 个答案:

答案 0 :(得分:2)

没有。从Gunicorn工作者主线中产生的线程没什么特别的。

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

如果要在重新使用相同的工作线程之前等待这些线程完成,则必须在WSGI应用程序(例如django.core.handlers.wsgi.WSGIHandler.__call__())返回之前执行此操作。或者为Gunicorn写一些疯狂的猴子补丁来跟踪儿童线程。

TL; DR你绝对可以通过从工作者主线程中生成长时间运行的子线程而不受限制地增长线程。最好保证他们能在一段时间内完成超时。