uWSGI线程用于什么?

18

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

我了解每个请求都在不同的进程中提供服务。那么线程是用来做什么的?

3个回答

20

进程和线程都可以用于增加并发性。线程比进程更便宜且使用更少的资源,但由于Python GIL的缘故,可能不总是并行运行。

此外,引用uWSGI 文档的说法:

没有设置进程或线程数量的魔法规则,这非常依赖于应用程序和系统。简单的数学计算如 processes = 2 * cpucores 并不足够。你需要尝试各种设置,并准备随时监视你的应用程序。 uwsgitop 可以成为找到最佳值的好工具。


1
每个进程会启动一个线程来处理请求吗? 那么,我可以使用上述配置处理8个并发请求吗? 在这三种配置中,“4个进程和2个线程”、“4个线程”、“4个进程”之间有区别吗? - Anubhav Agarwal
17
4个进程4个线程可以同时处理和扩展到16个请求。如果应用程序瓶颈是等待数据库输入输出,那么线程对Python不会造成惩罚。此外,每个进程需要固定数量的内存来启动一个新的Python虚拟机,但线程则不需要。 - Mikko Ohtamaa
3
请注意,可能会阻塞或运行时间较长的操作(如I/O、图像处理和NumPy数值计算)发生在GIL之外。因此,如果应用程序受到I/O限制,使用线程比进程更好吗? - Cloud

3

由于我今天遇到了一个巨大的问题,所以在这里添加了另一个额外的答案。

共享内存可以在线程之间使用,但不能在进程之间使用。也就是说,如果你有一些模块级别的东西,例如:

# mymodule
mycache = {}

mycache[key] = value

del mycache[key]

...

一个进程中的删除操作不会反映在另一个进程的缓存中。然而,如果只使用一个进程,在一个线程中进行的删除操作将跨越线程持久存在。

因此,如果您正在使用共享内存,有两个选择:

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

这正是我一直在寻找的,关于uwsgi中线程如何共享内存的问题。谢谢! - Cruncher

1
同时使用主uwsgi进程分叉工作进程。这意味着应用程序只启动一次,并且内存被复制。 因此,如果缓存数据在启动时被初始化,则uwsgi将在分叉时复制缓存。 但请注意,如果您在某个工作进程中更新缓存,则不会更改其他分叉的工作进程中的缓存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接