在Flask应用程序中使用zerorpc会引发错误“操作将永远阻止”

时间:2019-05-21 21:08:10

标签: python python-3.x flask zerorpc

我有一个在Python中使用zerorpc的RPC服务器,是这样编写的

import zerorpc
from service import Service

print('RPC server - loading')
def main():
    print('RPC server - main')
    s = zerorpc.Server(Service())
    s.bind("tcp://*:4242")
    s.run()

if __name__ == "__main__" : main()

在创建客户时效果很好

import zerorpc, sys

client_rpc = zerorpc.Client()
client_rpc.connect("tcp://127.0.0.1:4242")
name = sys.argv[1] if len(sys.argv) > 1 else "dude"
print(client_rpc.videos('138cd9e5-3c4c-488a-9b6f-49907b55a040.webm'))

并运行它。 print()输出此“视频”功能返回的内容。

但是当我尝试通过Flask应用在路由内使用相同的代码时,收到以下错误:

  

文件“ src / gevent / __ greenlet_primitives.pxd”,第35行,在   gevent .__ greenlet_primitives._greenlet_switch   gevent.exceptions.LoopExit:此操作将永远阻止Hub:   

烧瓶法/摘录

import zerorpc, sys

client_rpc = zerorpc.Client()
client_rpc.connect("tcp://127.0.0.1:4242")

@app.route('/videos', methods=['POST'])
def videos():

    global client_rpc
    client_rpc.videos('138cd9e5-3c4c-488a-9b6f-49907b55a040.webm')

我找不到可能发生的情况。我对Python还是很陌生,我知道这可能与Flask及其如何处理线程有关,但是我不知道如何解决它。

1 个答案:

答案 0 :(得分:0)

zerorpc依赖于gevent,它为异步IO提供了协同协程。这意味着您的flask应用程序必须对所有IO操作使用gevent。

在特定情况下,您可能会使用标准的阻塞IO WSGI服务器启动应用程序。

以下是使用gevent的WSGI服务器的代码段:

import zerorpc
from gevent.pywsgi import WSGIServer

app = Flask(__name__)

client_rpc = zerorpc.Client()
client_rpc.connect("tcp://127.0.0.1:4242")

@app.route('/videos', methods=['POST'])
def videos():
    global client_rpc
    client_rpc.videos('138cd9e5-3c4c-488a-9b6f-49907b55a040.webm')

# ...

if __name__ == "__main__":
    http = WSGIServer(('', 5000), app)
    http.serve_forever()

摘录自https://sdiehl.github.io/gevent-tutorial/#chat-server