免责声明:我知道 SO 上有几个类似的问题。我认为我读了大部分,如果不是全部,但没有找到答案(请参阅后面的真正问题)。我还知道使用 celery 或其他异步队列系统是实现长时间运行任务的最佳方法——或者至少使用 cron 管理的脚本。还有 mod_wsgi doc about processes and threads 但我不确定我的理解是否正确。
问题是:
使用下面列出的解决方案时涉及到的确切风险/问题是什么?它们中的任何一个适合长时间运行任务吗(好的,即使 celery 更适合)?我的问题实际上更多地是了解 wsgi 和 python/django 的内部工作方式,而不是寻找最佳的整体解决方案。线程阻塞、对变量的不安全访问、僵尸进程等问题。
假设:
1. 我的"long_process"正在执行某些非常安全的操作。即使它失败了,我也不在乎。 2. Python >=2.6 3. 我正在使用带有 Apache 的 mod_wsgi(使用守护进程模式),那么,如果使用 uwsgi 或 gunicorn 会发生什么变化吗?
mod_wsgi配置:
我认为以下是可用于启动独立进程(广义上的意思)来执行长时间运行任务并快速向用户返回响应的选项:
(脚本可能是 manage.py 命令的地方)
该段文字讲解了在CPython中由于全局解释器锁(Global Interpreter Lock),只能有一个线程执行Python代码,但是一些性能优化的库可能会克服这个限制。如果想要应用程序更好地利用多核机器的计算资源,建议使用multiprocessing。然而,如果想要同时运行多个I/O密集型任务,仍然可以使用线程模型。
问题描述主线程将快速返回(httpresponse)。产生的长线程是否会阻塞WSGI做其他请求?
这应该解决线程并发问题,不是吗?
这些是我能想到的选项。哪些会起作用,哪些不会,为什么?
问题是:
使用下面列出的解决方案时涉及到的确切风险/问题是什么?它们中的任何一个适合长时间运行任务吗(好的,即使 celery 更适合)?我的问题实际上更多地是了解 wsgi 和 python/django 的内部工作方式,而不是寻找最佳的整体解决方案。线程阻塞、对变量的不安全访问、僵尸进程等问题。
假设:
1. 我的"long_process"正在执行某些非常安全的操作。即使它失败了,我也不在乎。 2. Python >=2.6 3. 我正在使用带有 Apache 的 mod_wsgi(使用守护进程模式),那么,如果使用 uwsgi 或 gunicorn 会发生什么变化吗?
mod_wsgi配置:
WSGIDaemonProcess NAME user=www-data group=www-data threads=25
WSGIScriptAlias / /path/to/wsgi.py
WSGIProcessGroup %{ENV:VHOST}
我认为以下是可用于启动独立进程(广义上的意思)来执行长时间运行任务并快速向用户返回响应的选项:
os.fork
import os
if os.fork()==0:
long_process()
else:
return HttpResponse()
子进程
import subprocess
p = subprocess.Popen([sys.executable, '/path/to/script.py'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
(脚本可能是 manage.py 命令的地方)
线程
import threading
t = threading.Thread(target=long_process,
args=args,
kwargs=kwargs)
t.setDaemon(True)
t.start()
return HttpResponse()
NB.
表示“注意”或者“重要提示”。该段文字讲解了在CPython中由于全局解释器锁(Global Interpreter Lock),只能有一个线程执行Python代码,但是一些性能优化的库可能会克服这个限制。如果想要应用程序更好地利用多核机器的计算资源,建议使用multiprocessing。然而,如果想要同时运行多个I/O密集型任务,仍然可以使用线程模型。
问题描述主线程将快速返回(httpresponse)。产生的长线程是否会阻塞WSGI做其他请求?
multiprocessing
表示“多进程”。from multiprocessing import Process
p = Process(target=_bulk_action,args=(action,objs))
p.start()
return HttpResponse()
这应该解决线程并发问题,不是吗?
这些是我能想到的选项。哪些会起作用,哪些不会,为什么?