簡體   English   中英

在Flask app中使用zerorpc拋出錯誤“操作會永遠阻塞”

[英]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()

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM