[英]Program using zerorpc and threading throws Exception "LoopExit: This operation would block forever"
[英]Use zerorpc inside Flask app throws error “operation would block forever”
我有一個在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()輸出'videos'函數返回的內容。
但是當我嘗試在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有一些關系以及它如何處理線程,但我無法弄清楚如何解決它。
zerorpc依賴於gevent,它提供與協作協同程序的異步IO。 這意味着您的燒瓶應用程序必須對所有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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.