gpt4 book ai didi

python - 在 Gunicorn workers 之间共享一个对象,或者在一个 worker 中持久化一个对象

转载 作者:太空狗 更新时间:2023-10-29 21:43:43 28 4
gpt4 key购买 nike

我正在使用 Nginx/Gunicorn/Bottle 堆栈编写一个 WSGI 应用程序,它接受 GET 请求,返回一个简单的响应,然后将消息写入 RabbitMQ。如果我直接通过 Bottle 运行应用程序,那么每次应用程序收到 GET 时我都会重新使用 RabbitMQ 连接。但是,在 Gunicorn 中,看起来工作人员每次都在破坏和重新创建 MQ 连接。我想知道是否有重用该连接的好方法。

更详细的信息:

##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()

最佳答案

好的,这花了我一些时间来整理。实际情况是,每次收到新请求时,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 毫秒的调用现在需要 4 毫秒。我过去在 90 个 Gunicorn worker 上的最大调用次数为每秒 80 次,现在我在 5 个 Gunicorn worker 中的最大调用次数为每秒 700 次左右。

关于python - 在 Gunicorn workers 之间共享一个对象,或者在一个 worker 中持久化一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16092012/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com