Gunicorn如何加载和执行应用程序?

时间:2018-01-09 18:27:48

标签: python gunicorn

假设我正在使用Gunicorn网站上的示例应用程序:

def app(environ, start_response):
    data = b"Hello, World!\n"
    start_response("200 OK", [
        ("Content-Type", "text/plain"),
        ("Content-Length", str(len(data)))
    ])
    return iter([data])

然后我运行服务器:

gunicorn -w 4 myapp:app

我是否正确理解每个工作人员使用加载的模块myapp表示单独的Python进程?如果是这样,如果我在这个模块中有一个全局变量,我可以安全地拥有4个不同的状态(虽然这只是一个坏主意,仅作为一个例子)。

我使用上面稍微修改过的应用程序进行了一个简单的实验:

import os
import string
import random

global_list = []


def app(environ, start_response):
    random_char = random.sample(string.ascii_uppercase, 1).pop()
    global_list.append(random_char)

    s = ("PID=%s %s" % (os.getpid(), global_list)).encode('ascii')
    data = bytes(s)
    start_response("200 OK", [
        ("Content-Type", "text/plain"),
        ("Content-Length", str(len(data)))
    ])
    return iter([data])

这就是我一个接一个地提出要求时所得到的:

  • PID = 9 ['A']
  • PID = 8 ['Y']
  • PID = 9 ['A','R']
  • PID = 7 ['我','X','我']
  • ...

为什么最后一个输出有三个项目而不是一个如果第一次启用PID 7的工作人员?有人可以开导我吗?我没有在Gunicorn文档中找到任何内容。

谢谢。

PS:好的,我明白了。由于我是从浏览器发出请求,因此它默默地请求/favicon.ico,因此发出了三个意外请求。在我尝试卷曲之后,它运作得很好。

现在唯一的问题是每个工作者有一个Python进程。是真的吗?

1 个答案:

答案 0 :(得分:0)

  

我是否正确理解每个工作人员使用加载的模块myapp代表一个单独的Python进程?

是的,确切地说。来自Gunicorn docs

  

工人:   处理请求的工作进程数。

(请注意,Gunicorn只会加载您的应用一次,然后分叉所请求的工作人员数量,因此您的应用实际上并未“加载”N次。)

  

如果是这样,如果我在这个模块中有一个全局变量,我可以安全地拥有4个不同的状态(虽然这是一个坏主意,仅作为一个例子)。

是的,每个流程都有自己的状态。