我在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
我了解每个请求都在不同的流程中提供。那么用于什么线程?
答案 0 :(得分:6)
进程和线程都可用于增加并发性。 线程比进程便宜并且使用更少的资源,但由于Python GIL可能并不总是并行运行。
另外,引用uWSGI documentation:
设置进程或线程数没有神奇的规则 使用。它非常依赖于应用程序和系统。简单的数学 像
processes = 2 * cpucores
一样是不够的。你需要 尝试各种设置,并准备不断监控 你的应用。uwsgitop
可能是找到最佳价值的好工具。
答案 1 :(得分:0)
由于我今天有一个巨大的 GOTCHA,在此处添加了一个额外的答案。
共享内存可以跨线程工作,但不能跨进程工作。也就是说,如果你有一些模块级别的东西,比如:
# mymodule
mycache = {}
mycache[key] = value
del mycache[key]
...
一个进程中的删除不会反映在另一个进程的缓存中。但是,在一个线程中删除,如果只使用一个进程,将跨线程持续存在。
所以如果你像这样使用共享内存,你有两个选择:
答案 2 :(得分:0)
还有主进程 uwsgi 正在分叉工人。这意味着,应用程序启动一次并复制内存。 因此,如果在启动时初始化缓存数据,uwsgi 将分叉复制缓存。 但请记住,如果您更新某个工作程序中的缓存,其他分叉工作程序上的缓存不会发生变化。