我在寻找关于Gunicorn/Django进程/线程生命周期的文档方面遇到了问题。
假设在process_response()中间件钩子期间生成一个守护线程。据我所知,此线程不会阻塞HTTP响应。但是,它是否会阻塞从中生成的线程?在工作进程准备处理另一个请求之前,Gunicorn是否等待该线程完成并将其加入回主线程,还是将分离该线程?
更多细节:
我编写了一个自定义的中间件类,将一些数据发送到外部队列(RabbitMQ),稍后由celery worker异步检索和处理。我不希望这个“通过网络”排队调用阻塞客户端的响应,因此我在“守护进程”线程中包装该函数(add_event.delay())(参见http://www.artfulcode.net/articles/threading-django/)。如果出现网络故障并且重试策略具有长时间限制,则此线程可能会运行很长时间。在这种情况下,这些线程是否会阻塞我的Gunicorn工作进程?
我阅读了这个问题,但我不确定我的线程是否干扰了“Worker的主循环”: Danger to having long lasting (non-deamon) threads in a Django/Gunicorn app?
假设在process_response()中间件钩子期间生成一个守护线程。据我所知,此线程不会阻塞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())(参见http://www.artfulcode.net/articles/threading-django/)。如果出现网络故障并且重试策略具有长时间限制,则此线程可能会运行很长时间。在这种情况下,这些线程是否会阻塞我的Gunicorn工作进程?
我阅读了这个问题,但我不确定我的线程是否干扰了“Worker的主循环”: Danger to having long lasting (non-deamon) threads in a Django/Gunicorn app?