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]
...
一个进程中的删除不会反映在另一个进程的缓存中。但是,一个线程中的删除,如果只使用一个进程,将跨线程持续存在。
所以如果你像这样使用共享内存,你有两个选择:
- 所有缓存都应该是“安全的”和“通读的”(即在缓存未命中时,尝试加载真实数据)
- 始终运行 线程=X 但进程=1
还有主进程 uwsgi 正在分叉工人。这意味着,应用程序启动一次并复制内存。
因此,如果在启动时初始化缓存数据,uwsgi 将分叉复制缓存。
但请记住,如果您在某些工作人员中更新缓存,它不会在其他分叉工作人员中更改。
我在 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]
...
一个进程中的删除不会反映在另一个进程的缓存中。但是,一个线程中的删除,如果只使用一个进程,将跨线程持续存在。
所以如果你像这样使用共享内存,你有两个选择:
- 所有缓存都应该是“安全的”和“通读的”(即在缓存未命中时,尝试加载真实数据)
- 始终运行 线程=X 但进程=1
还有主进程 uwsgi 正在分叉工人。这意味着,应用程序启动一次并复制内存。 因此,如果在启动时初始化缓存数据,uwsgi 将分叉复制缓存。 但请记住,如果您在某些工作人员中更新缓存,它不会在其他分叉工作人员中更改。