2013-04-18 33 views
5

我正在寫使用接受GET請求Nginx上/ Gunicorn /瓶堆的WSGI應用內持續的對象,返回一個簡單的響應,然後向的RabbitMQ寫入消息。如果我是貫穿直瓶的應用程序,我想是每一個應用程序臨危一有時間重新使用RabbitMQ的連接。但是,在Gunicorn,看起來工作人員每次都在銷燬和重新創建MQ連接。我想知道是否有重用該連接的好方法。共享Gunicorn工人之間的物體,或工人

更詳細的信息:

##This is my bottle app 
from bottle import blahblahblah 
import bottle 
from mqconnector import MQConnector 

mqc = MQConnector(ip, exchange) 

@route('/') 
def index(): 
    try: 
    mqc 
    except NameError: 
    mqc = MQConnector(ip, exchange) 

    mqc.publish('whatever message') 
    return 'ok' 

if __name__ == '__main__': 
    run(host='blah', port=808) 
app = bottle.default_app() 

回答

5

好吧,這花了我一些時間來理清。正在發生的事情是,每一個新的請求來穿越時空,Gunicorn正在運行我index()方法,因此,創造MQConnector一個新的實例。

此修復程序是重構MQConnector這樣,而不是一類,它只是一堆方法和變量。這樣一來,每個工人提到了相同 MQConnector每一次,而不是創建MQConnector的新實例。最後,我傳承下去MQConnector的publish()功能。

#Bottle app 
from blah import blahblah 
import MQConnector 

@route('/') 
def index(): 
    blahblah(foo, bar, baz, MQConnector.publish) 

#MQConnector 
import pika 
mq_ip = "blah" 
exhange_name="blahblah" 

connection=pika.BlockingConnection(.... 
... 

def publish(message, r_key): 
    ... 

結果:過去需要800毫秒的呼叫現在需要爲4ms。我曾經在90個Gunicorn工作人員中以每秒80個呼叫的速度最大化,現在我在5個Gunicorn工作人員中最多可以處理大約700個呼叫/秒。

相關問題