我有一个在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及其如何处理线程有关,但是我不知道如何解决它。
答案 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()