14

我正在使用 gunicorn 运行一些烧瓶和 django 应用程序,使用 gevent 工作者,并且有一些问题......

首先,我假设因为 gunicorn fork 和实例化我的进程,它会猴子修补标准模块,我不必自己调用 monkey.patch_all,它已经为我完成了,每个请求都作为 greenlet 运行,是吗正确的?

其次,这是重要的部分,哪些功能真的是被 gunicorn-gevent 修补的?当您使用 gevent 时,您总是可以选择要修补哪个功能(socket、patch、urllib)...所以,问题是,这些功能中的哪些真的是猴子修补了 bu gunicorn-gevent?如何更改此列表?

例如,对 monkey.patch_all() 的标准调用不会修补 urllib?我怎么知道它是否被修补?以及如何强制 gunicorn-gevent 修补它?

谢谢

4

2 回答 2

9

看起来 gevent 工作人员在初始化时调用了 monkey.patch_all() 。

https://github.com/benoitc/gunicorn/blob/master/gunicorn/workers/ggevent.py#L45

当您的应用启动时,您仍然可以调用自己的初始化代码。

对于烧瓶,我使用 gunicorn 贴纸。

my_app.ini:

[app:main]
use = egg:mypackage#myapp
# app config goes here

[server:main]
use = egg:gunicorn#main
# you can put gunicorn config options here

setup.py 在你的包中:

entry_points={
    'paste.app_factory': [
        'myapp = mypackage.module:app_factory'
    ]

例如 mypackage/module.py:

def app_factory(global_config, **config):
    # initialization code / gevent monkey patch goes here
    # also you can assemble your wsgi stack.
    # then return your flask app
    return app

现在你可以运行它了:

gunicorn_paster my_app.ini
于 2012-08-17T20:37:16.440 回答
0

我已经回答了一个类似的问题,这可能会解决您的问题。
参考这个问题:Do I need call monkey.patch_all() in Django+Gunicorn+GEvent+Boto structure?

首先,gunicorn 默认使用SyncWorkers,如果您不更改配置,则服务器不会使用 greenlets。即使您全部修补,我认为它也没有太大帮助,因为 gunicorn 默认一次处理一个请求。

其次,看看GeventWorker的源代码,它实际上是猴子补丁。

于 2013-12-07T02:06:09.233 回答