2012-08-17 59 views
7

我使用gunicorn运行一些烧瓶和Django应用程序,使用GEVENT工人,并有一些问题...哪些功能是由gunicorn gevent worker修补的猴子?

首先,我认为,既然gunicorn叉和实例我的过程中,它会猴补丁的标准模块,而且我不必自己调用monkey.patch_all,它已经为我完成了,并且每个请求都作为一个greenlet运行,这是正确的吗?

其次,这是一个重要的部分,哪些特征真的被gunicorn-gevent修补过吗? 当你使用gevent时,你总是可以选择修补哪些功能(套接字,补丁,urllib)... 所以,问题是,哪些功能真的有猴子补丁bu gunicorn-gevent? 我如何更改此列表?

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

感谢

回答

5

貌似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 
+0

嗨,感谢您的提示,它会调用patch_all(),默认情况下它不会修补urllib,所以我如何在初始化时修补它?有没有办法确定修补什么和修补什么?谢谢 – Joseph 2012-08-18 04:30:06

+0

不是真的,但随后的猴子补丁是好的。 – gwik 2012-08-18 16:05:43

+0

好的,有些题外话题:为什么选择gunicorn贴纸?它有什么好处?谢谢 – Joseph 2012-08-18 20:16:35

1

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

首先,gunicorn使用SyncWorkers为默认,如果不更改配置,则服务器将不使用greenlets。即使你把所有的修补程序都修复了,我认为它并没有太大的帮助,因为gunicorn在默认情况下一次处理一个请求。

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