ern*_*rny 5 python multithreading uwsgi
我正在使用 uwsgi 版本 2.0.13.1 和以下配置:
bin/uwsgi -M -p 5 -C -A 4 -m -b 8192 -s :3031 --wsgi-file bin/django.wsgi --pidfile var/run/uwsgi.pid --touch-reload=var/run/reload-uwsgi.touch --max-requests=1000 --reload-on-rss=450 --py-tracebacker var/run/pytrace --auto-procname --stats 127.0.0.1:3040 --threads 40 --reload-mercy 600 --listen 200
Run Code Online (Sandbox Code Playgroud)
(绝对路径名删掉)
当我跑步时uwsgitop,所有 5 个工人都显得很忙。当我尝试使用 py-tracebacker 获取每个工作线程/线程的堆栈跟踪时,我没有得到答案。进程只是挂起。
我如何研究导致 uwsgi 进程挂起的确切事实?
我怎样才能避免这种情况呢?
我知道 harakiri 参数,但我不确定如果进程有其他活动线程,该进程是否会被终止。
PD:“重新加载怜悯”设置为非常高的值,以避免杀死仍处于活动线程的工作人员(似乎是一个错误)。我们有一些 Web 请求仍然需要很长时间(这些请求无法转换为作业)。
提前致谢。
尽管我已经添加了评论,但这里有更长的描述。
警告:仅当使用多个工作进程和多个线程(-p --threads)时才会出现此问题。
简短版本:在 Python 2.7.x 中,某些模块在导入期间(日志记录、编解码器的隐式导入)不是 100% 线程安全的。尝试在提供给 uwsgi 的 wsgi 文件中导入所有此类有问题的模块(即在 uwsgi 分叉之前)。
长版本:在https://github.com/unbit/uwsgi/issues/1599中,我分析了该问题,发现它可能与python bug with thelogging module有关。这个问题可以通过在执行 uwsgi 的 wsgi 脚本执行之后发生的 uwsgi 分叉之前导入和初始化任何关键模块来解决。
我终于解决了直接或间接从 wsgi 文件导入 django settings.ROOT_URLCONF 的问题。这还有减少内存消耗(因为工作程序之间共享的代码库更大)和每个工作程序初始化时间的好处。