【发布时间】:2016-03-14 22:36:19
【问题描述】:
我在 uwsgi.ini 文件中看到有一个配置
[uwsgi]
socket = 127.0.0.1:3031
chdir = /home/foobar/myproject/
wsgi-file = myproject/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191
我了解每个请求都在不同的流程中处理。那么线程是干什么用的呢?
【问题讨论】:
我在 uwsgi.ini 文件中看到有一个配置
[uwsgi]
socket = 127.0.0.1:3031
chdir = /home/foobar/myproject/
wsgi-file = myproject/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191
我了解每个请求都在不同的流程中处理。那么线程是干什么用的呢?
【问题讨论】:
进程和线程都可用于增加并发性。 线程比进程更便宜并且使用更少的资源,但由于 Python GIL,可能并不总是并行运行。
另外,引用 uWSGI documentation:
设置进程数或线程数没有神奇的规则 使用。它非常依赖于应用程序和系统。简单的数学 像
processes = 2 * cpucores是不够的。你需要 尝试各种设置并准备好持续监控 你的应用程序。uwsgitop可能是找到最佳价值的好工具。
【讨论】:
由于我今天有一个巨大的 GOTCHA,所以在这里添加一个额外的答案。
共享内存可以跨线程工作,但不能跨进程工作。也就是说,如果你有一些模块级别的东西,比如:
# mymodule
mycache = {}
mycache[key] = value
del mycache[key]
...
一个进程中的删除不会反映在另一个进程的缓存中。但是,一个线程中的删除,如果只使用一个进程,将跨线程持续存在。
所以如果你像这样使用共享内存,你有两个选择:
【讨论】:
还有主进程 uwsgi 是分叉工人。这意味着,应用程序启动一次并复制内存。 因此,如果在启动时初始化缓存数据,uwsgi 将分叉复制缓存。 但请记住,如果您在某些工作人员中更新缓存,它不会改变其他分叉工作人员。
【讨论】: