如何避免Django子线程被uWSGI重生杀死

2024-10-01 05:06:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Django+uWSGI创建了一个web服务器。基本流程是:当接收到请求时,Django通过python内置的lib“Threading”启动一个子线程异步写db,在主线程中它会立即响应到客户端。在

如何,uWSGI有时会重新生成工作进程(可能是当进程没有处理请求时?),这会导致后台子线程即使尚未完成也会被终止。有什么线索可以避免uWSGI不重新生成具有正在运行的子线程的工作进程?在

uWSGI重生日志:

DAMN ! worker 4 (pid: 31161) died, killed by signal 9 :( trying respawn ...

uWSGI ini配置(版本2.0.12):

^{pr2}$

Django(1.8版)应用程序伪代码:

在处理程序.py公司名称:

import threading

class SubThreadClass(threading.Thread):
    daemon = True

    def run(self):
        # actions to write db

def myHandler():
    my_sub_thread = SubThreadClass()
    my_sub_thread.start()

在视图.py公司名称:

from handlers import myHandler

def url_handler(request): 
    myHandler()
    return HttpResponse()

Tags: djangopyimport名称db进程mydef
2条回答

在我的例子中,这个问题是由于我的数据库的某些操作的延迟造成的。在

我使用uWSGI金字塔http://docs.pylonsproject.org/projects/pyramid/en/latest/)。因为您使用的是Django(Python),所以解决方案很可能适合您。在

下面引用的设置位于配置文件生产.ini(第[uwsgi])(http://uwsgi-docs.readthedocs.io/en/latest/Options.html)。在

我用下面的规则“解决”了这个问题。这个规则“解决”了问题,因为它大大减少了它的发生。到目前为止,我还没有看到任何可以完全避免的事情。我的表现也有了提高(需要测试,但我们的评估是很好的改进)。解决方案基本上是根据数据库允许的连接数增加线程数(也可以增加数据库允许的连接数)。在

规则:

定义进程的数量(进程中的参数生产.ini或同等产品)

q=n*2

q - number of processes
n - number of CPUs/cores

定义线程的数量(线程在生产.ini或同等产品)

^{pr2}$

还要注意sqlalchemy.pool_大小参数(如果您使用sqlalchemyhttp://www.sqlalchemy.org/)应该被赋予与t相同的值

加上:

为了防止Python进程访问生产.ini同时,当它们重新启动导致“锁定”时,在[uwsgi]部分添加“lazy apps=true”参数。只有在系统出现问题时才执行此操作。

在不需要管理的环境中,手动处理线程很少是一个好主意。在

您应该使用脱机工作系统,如Celery。在

相关问题 更多 >