什么是uwsgi线程用于?

时间:2015-12-09 15:21:49

标签: python wsgi 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

我了解每个请求都在不同的流程中提供。那么用于什么线程?

3 个答案:

答案 0 :(得分:6)

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

另外,引用uWSGI documentation

  

设置进程或线程数没有神奇的规则   使用。它非常依赖于应用程序和系统。简单的数学   像processes = 2 * cpucores一样是不够的。你需要   尝试各种设置,并准备不断监控   你的应用。 uwsgitop可能是找到最佳价值的好工具。

答案 1 :(得分:0)

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

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

# mymodule
mycache = {}

mycache[key] = value

del mycache[key]

...

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

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

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

答案 2 :(得分:0)

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