假设我正在使用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 7的工作人员?有人可以开导我吗?我没有在Gunicorn文档中找到任何内容。
谢谢。
PS:好的,我明白了。由于我是从浏览器发出请求,因此它默默地请求/favicon.ico
,因此发出了三个意外请求。在我尝试卷曲之后,它运作得很好。
现在唯一的问题是每个工作者有一个Python进程。是真的吗?
答案 0 :(得分:0)
我是否正确理解每个工作人员使用加载的模块myapp代表一个单独的Python进程?
是的,确切地说。来自Gunicorn docs:
工人: 处理请求的工作进程数。
(请注意,Gunicorn只会加载您的应用一次,然后分叉所请求的工作人员数量,因此您的应用实际上并未“加载”N次。)
如果是这样,如果我在这个模块中有一个全局变量,我可以安全地拥有4个不同的状态(虽然这是一个坏主意,仅作为一个例子)。
是的,每个流程都有自己的状态。