当运行gunicorn这个命令启动flask的时候
首先回去调用gunicorn/app/wsgiapp中的run方法
回去调用run()方法,这个run方式本质是gunicorn/arbiter中的run()方法
主要就关注其中manage_workers()方法
很明显调用了spawn_workers()方法,这个方式只是遍历了spawn_worker()。因此我们直接看spawn_worker()方法
可以发现 初始化了一个workclass,这个worker是gunicorn/workers/sync。为什么是使用这个因为在gunicorn/config中的worker_class默认使用的SyncWorker
好了接下来我们说一下worker,这些worker本质上都是为了处理一个一个request的
看到respiter = self.wsgi(environ, resp.start_response)这个了吗,这就是gunicorn符合wsgi的内涵。这个吧当前的环境和一个response传进去,当然传出了的也是response。
我们看看这个方法是那里呢?
寻找了一下是在生成worker的时候传入的app中获取的。
那么我们来看一下这个app到底是什么东西,在gunicorn中的Arbiter初始化函数中有一句
这个app本质就是从外部初始化传进来的,寻找这个类常初始化的地方gunicorn/app/base中
感情把自己的实例传进去了,不过在这里也找到了wsgi()方法
这个load()方法是子类gunicorn/app/wsgiapp中实现的
最后看一下load_wsgiapp()
他的意思就是把你在命令中的app实例导入。这里最后提一下在flask中的实现,这个是FLASK类在flask/app.py中
因为这个类实现了__call__方法所以使用实例传入参数以后就来到了flask框架进行request处理。