【问题标题】:What are uwsgi threads used for?uwsgi 线程是做什么用的?
【发布时间】:2016-03-14 22:36:19
【问题描述】:

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


    【解决方案1】:

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

    另外,引用 uWSGI documentation

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

    【讨论】:

    • 每个进程是否启动一个线程来服务请求?如我可以从上述配置中提供 8 个并发请求吗?这3个配置4进程和2线程4线程4进程有区别吗?
    • 4 个进程 4 个线程可以同时处理和扩展到 16 个请求。如果应用程序瓶颈是等待数据库 IO,那么线程不会增加 Python 的损失。此外,每个进程都需要固定数量的内存来启动一个新的 Python 虚拟机。线程不这样做。
    • > 请注意,潜在的阻塞或长时间运行的操作,例如 I/O、图像处理和 NumPy 数字运算,发生在 GIL 之外。那么如果应用程序是 IO 绑定的,那么使用线程而不是进程会更好吗?
    【解决方案2】:

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

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

    # mymodule
    mycache = {}
    
    mycache[key] = value
    
    del mycache[key]
    
    ...
    

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        • 1970-01-01
        • 2014-06-26
        • 2016-02-21
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多