uwsgi 线程有什么用?

What are uwsgi threads used for?

我在 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:

There is no magic rule for setting the number of processes or threads to use. It is very much application and system dependent. Simple math like processes = 2 * cpucores will not be enough. You need to experiment with various setups and be prepared to constantly monitor your apps. uwsgitop could be a great tool to find the best values.

由于我今天有一个巨大的 GOTCHA,在这里添加一个额外的答案。

共享内存跨线程工作,但不跨进程工作。也就是说,如果你有一些模块级别的东西,比如:

# mymodule
mycache = {}

mycache[key] = value

del mycache[key]

...

一个进程中的删除不会反映在另一个进程的缓存中。但是,一个线程中的删除,如果只使用一个进程,将跨线程持续存在。

所以如果你像这样使用共享内存,你有两个选择:

  1. 所有缓存都应该是“安全的”和“通读的”(即在缓存未命中时,尝试加载真实数据)
  2. 始终运行 线程=X 但进程=1

还有主进程 uwsgi 正在分叉工人。这意味着,应用程序启动一次并复制内存。 因此,如果在启动时初始化缓存数据,uwsgi 将分叉复制缓存。 但请记住,如果您在某些工作人员中更新缓存,它不会在其他分叉工作人员中更改。