我用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()
在我的例子中,这个问题是由于我的数据库的某些操作的延迟造成的。在
我使用uWSGI和金字塔(http://docs.pylonsproject.org/projects/pyramid/en/latest/)。因为您使用的是Django(Python),所以解决方案很可能适合您。在
下面引用的设置位于配置文件生产.ini(第[uwsgi])(http://uwsgi-docs.readthedocs.io/en/latest/Options.html)。在
我用下面的规则“解决”了这个问题。这个规则“解决”了问题,因为它大大减少了它的发生。到目前为止,我还没有看到任何可以完全避免的事情。我的表现也有了提高(需要测试,但我们的评估是很好的改进)。解决方案基本上是根据数据库允许的连接数增加线程数(也可以增加数据库允许的连接数)。在
规则:
定义进程的数量(进程中的参数生产.ini或同等产品)
定义线程的数量(线程在生产.ini或同等产品)
^{pr2}$还要注意sqlalchemy.pool_大小参数(如果您使用sqlalchemyhttp://www.sqlalchemy.org/)应该被赋予与t相同的值
加上:
为了防止Python进程访问生产.ini同时,当它们重新启动导致“锁定”时,在[uwsgi]部分添加“lazy apps=true”参数。只有在系统出现问题时才执行此操作。
在不需要管理的环境中,手动处理线程很少是一个好主意。在
您应该使用脱机工作系统,如Celery。在
相关问题 更多 >
编程相关推荐