Disclaimer:我知道网上有几个类似的问题.我想我已经读了大部分(如果不是全部),但没有找到我真正问题的答案(见后文). 我还知道使用Celery 或其他异步队列系统是实现长时间运行任务的最佳方式-或者至少使用cron管理的脚本.也有mod_wsgi doc about processes and 螺纹个,但我不确定我都记对了.
问题是:
使用下面列出的解决方案具体涉及哪些风险/问题?它们中有没有适合长时间运行任务的(好的,尽管Celery 更适合)? 我的问题实际上更多的是关于理解WSGI和python/Django的内部 struct ,而不是寻找最佳的整体解决方案.阻塞线程、不安全访问变量、僵尸处理等问题.
比如说:
- 我的"长进程"正在做一些非常安全的事情.即使失败了,我也不在乎.
- python >= 2.6
- 我在Apache中使用mod_wsgi(uwsgi或genicorn会有什么变化吗?)在后台进程模式下
MOD_WSGI会议:
WSGIDaemonProcess NAME user=www-data group=www-data 螺纹=25
WSGIScriptAlias / /path/to/wsgi.py
WSGIProcessGroup %{ENV:VHOST}
我认为可以使用这些选项来启动单独的processes(广义的意思是)来执行长时间运行的任务,同时快速向用户返回响应:
操作系统.叉
import os
if 操作系统.叉()==0:
long_process()
else:
return HttpResponse()
子流程
import 子流程
p = 子流程.Popen([sys.executable, '/path/to/script.py'],
stdout=子流程.PIPE,
stderr=子流程.STDOUT)
(其中脚本很可能是manage.py命令)
螺纹
import threading
t = threading.Thread(target=long_process,
args=args,
kwargs=kwargs)
t.setDaemon(True)
t.start()
return HttpResponse()
注意:
由于全局解释器锁,在CPython中,一次只能有一个线程执行Python代码(尽管某些面向性能的库可能会克服这个限制).如果您希望应用程序更好地利用多核机器的计算资源,建议您使用多处理.但是,如果希望同时运行多个I/O绑定任务,线程仍然是一种合适的模型.
主线程将快速返回(httpresponse).生成的长线程会阻止wsgi为另一个请求做其他事情吗?!
多处理
from 多处理 import Process
p = Process(target=_bulk_action,args=(action,objs))
p.start()
return HttpResponse()
这应该可以解决线程并发问题,不是吗?
这些就是我能想到的 Select .什么有效,什么无效,为什么?