python进程需要时间在nginx和uwsgi上运行的django项目中启动

我开始使用python的多处理模块进程。 这个过程由django项目发送的post请求调用。 当我使用开发服务器(python manage.py runserver)时,发布请求不需要任何时间来启动进程并立即结束。

我使用nginxuwsgi部署了生产项目。

现在,当我发送相同的发布请求时,大约需要5-7分钟来完成该请求。 它只发生在我开始一个过程的那些post请求。 其他post请求正常工作。

什么可能是这个延迟的原因? 我该如何解决这个问题?

基本上,后台处理需要在WSGI应用程序模块之外启动。

在WSGI中,一个python webapp进程被启动来处理请求,其数目取决于配置。 如果这个过程产生了一个新的进程,将阻止WSGI进程处理新的请求,使服务器阻塞并等待它完成,然后处理新的请求。

我建议你在WSGI应用程序模块中使用一个共享队列来进入一个在WSGI应用程序模块之外启动的进程。 像下面的东西。 这将为webapp模块外部的每个WSGI进程启动一个新的处理器,以免阻塞请求。

your_app/webapp.py

 from . import bg_queue def post(): # Webapp POST code here bg_queue.add(<task data>) 

your_app/processor.py

 from multiprocessing import Process class Consumer(Process): def __init__(self, input_q): self.input_q = input_q def run(self): while True: task_data = input_q.get() <process data> 

your_app/__init__.py

 from .processor import Consumer bg_queue = Queue() consumer = Consumer(bg_queue) consumer.daemon = True consumer.start() 

我想出了一个解决方法(不知道它是否有资格作为答案)。 我写了后台进程作为数据库中的一个工作,并使用cronjob来检查是否有任何工作悬而未决,如果有任何cron将启动该工作的后台进程,将退出。

cron会每分钟运行一次,所以没有太多延迟。 这有助于提高性能,因为它帮助我执行这样的重任务,与主应用程序分开运行。