【发布时间】:2017-01-13 03:32:46
【问题描述】:
我用 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):
[uwsgi]
# Django's wsgi file
wsgi-file = /home/fh/dj_uwsgi/dj_site/dj_site/wsgi.py
master = true
processes = 10
http = :8001
threads = 2
enable-threads = true
http-timeout = 10
max-requests = 5000
chmod-socket = 664
vacuum = true
pidfile = /home/fh/dj_uwsgi/dj_site/uwsgi.pid
daemonize = /home/fh/log/uwsgi_dj.log
Django(1.8版)应用伪代码:
在 handlers.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()
在views.py中:
from handlers import myHandler
def url_handler(request):
myHandler()
return HttpResponse()
【问题讨论】:
-
听起来像是 XY 问题。你为什么首先使用线程?
-
嗨丹尼尔,我不知道什么是 XY 问题。你能分享更多信息吗?我这里使用多线程的原因只是为了尽快响应客户端,使其不会被db操作阻塞。 @丹尼尔罗斯曼
-
xyproblem.info - 即您不是在询问您的实际问题。正如您所发现的,在您无法管理的环境中,手动管理线程很少是一个好主意。使用像Celery 这样的离线工作系统。
-
谢谢,丹尼尔。芹菜完全可以满足我的要求。您能否在下面发布您的答案以便我接受?
-
如果你只需要这样的东西,Celery 是重量级的。如果你有 uwsgi,你可以使用它的 spooler 进程,并导入 uwsgidecorators 让它变得非常简单。
标签: python django multithreading uwsgi