我有一个使用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应用程序的路由内部相同的代码时,我会收到以下错误:
gevent.__greenlet_primitives._greenlet_switch gevent.exceptions.LoopExit中的第35行文件“src/gevent/__greenlet_pritives.pxd”:此操作将永远阻止集线器:
烧瓶法/摘录
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和它如何处理线程有关,但我不知道如何解决它。
发布于 2019-05-22 16:25:51
zerorpc依赖于gevent,它提供具有协作协同的异步IO。这意味着您的烧瓶应用程序必须在所有IO操作中使用gevent。
在您的特定情况下,您可能使用标准阻塞IO服务器启动应用程序。
下面是使用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://stackoverflow.com/questions/56246394
复制相似问题