Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行于nginx和uwsgi上的django项目中启动python过程需要时间_Python_Django_Nginx_Process_Uwsgi - Fatal编程技术网

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

在运行于nginx和uwsgi上的django项目中启动python过程需要时间,python,django,nginx,process,uwsgi,Python,Django,Nginx,Process,Uwsgi,我正在使用python的多处理模块启动一个进程。该流程由django项目中发送的post请求调用。当我使用developmentserver(python manage.py runserver)时,post请求不需要时间就可以启动流程并立即完成 我使用nginx和uwsgi将项目部署到生产环境中 现在,当我发送相同的post请求时,完成该请求大约需要5-7分钟。它只发生在那些我正在启动流程的post请求中。其他职位要求也可以 延迟的原因是什么?我该如何解决这个问题呢?基本上,后台处理需要在WS

我正在使用python的多处理模块启动一个进程。该流程由django项目中发送的post请求调用。当我使用developmentserver(python manage.py runserver)时,post请求不需要时间就可以启动流程并立即完成

我使用nginx和uwsgi将项目部署到生产环境中

现在,当我发送相同的post请求时,完成该请求大约需要5-7分钟。它只发生在那些我正在启动流程的post请求中。其他职位要求也可以


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

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

在WSGI中,会启动一个python webapp进程来处理请求,请求的数量会根据配置的不同而变化。如果此进程生成一个新进程,该进程将阻止WSGI进程处理新请求,则会使服务器阻塞并等待其完成,然后再处理新请求

我建议您在WSGI应用程序模块中使用一个共享队列,将其输入在WSGI应用程序模块外部启动的流程。类似下面的例子。这将为webapp模块外的每个WSGI进程启动一个新处理器,以避免阻止请求

你的应用程序/webapp.py

from . import bg_queue
def post():
    # Webapp POST code here
    bg_queue.add(<task data>)
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>
from .processor import Consumer
bg_queue = Queue()

consumer = Consumer(bg_queue)
consumer.daemon = True
consumer.start()
你的应用程序/\uuuuuu init\uuuuuuupy

from . import bg_queue
def post():
    # Webapp POST code here
    bg_queue.add(<task data>)
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>
from .processor import Consumer
bg_queue = Queue()

consumer = Consumer(bg_queue)
consumer.daemon = True
consumer.start()

我想出了一个解决办法(不知道是否可以作为答案)。 我将后台进程作为数据库中的作业编写,并使用cronjob检查是否有任何作业挂起,如果有,cron将启动该作业的后台进程并退出


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

在生产环境中运行代码时,处理是否成功?i、 e.您的部署配置是否不正确,导致网络超时/重试需要5-7分钟,然后失败?我已在nginx配置中将请求超时设置为900秒。所以他们不会超时。他们只是花了很多时间。而且没有错误发生。减速发生在哪里?启动新流程还是等待结果?如果是后者,POST请求是否需要在进程上进行处理时保持打开状态,或者它是否可以立即返回并在后台执行处理?一般来说,对于交互式应用程序,不会出现任何阻塞,因为处理时间因负载而异,并且会对结果进行回调或轮询以检索结果。否。post请求只是启动流程并返回。返回请求时,请求完成,前端会出现通知。启动的进程独立于应用程序,只需点击一个API。所以我不认为POST请求正在等待任何结果。另外,在dev服务器中,整个请求+过程工作正常,POST可以立即完成?您提到它正在访问一个API,该调用在本地和在生产中需要多长时间,以及处理总共需要多长时间?