[英]python zerorpc multithreading
我正在嘗試為python程序構建前端服務。 我選擇zerorpc在NodeJS和python之間進行通信,這很好用,我唯一遇到的問題是我無法正確地使用多線程zerorpc。
我看過幾篇關於零rpc和普通線程如何彼此不喜歡的文章。 但是我的后端服務已經有點先進,並且使用了多個線程。
因此,現在的問題是,是否可以以某種方式將普通線程和zerorpc結合起來,還是我必須重寫我的主代碼以利用與zerorpc相同的線程庫?
我在普通線程中遇到的主要問題是啟動服務器的線程完全凍結,因此無法再關閉。 這是我當前啟動服務器的方式:
self.communication_thread = Thread(target=communication_server.start_communication_server)
self.communication_thread.start()
def start_communication_server():
global server
addr = 'tcp://127.0.0.1:4242'
server = zerorpc.Server(CommunicationServer())
server.bind(addr)
print('Created a new communicationserver running on {}'.format(addr))
server.run()
我也嘗試使用以下功能殺死服務器,但這會導致異常,這不是所希望的
def kill_server():
global server
server.stop()
在此先感謝您對我的幫助!
zerorpc與gevent(ioloop +協程等)實現並發。 Gevent是單線程的,初始化后只能從最初用於初始化它的線程中使用。 在您的情況下,這是調用server.run()
的線程。 因此,您只能與同一線程中的zerorpc方法進行交互。
您可以使用猴子補丁程序( http://www.gevent.org/intro.html#monkey-patching ),它可以有效地使Thread
對象表現得像協程。 如果僅將線程用於IO並發,那么這可能就足夠了。
否則,如果您希望線程具有CPU並行性,那么一種行之有效的解決方案是將子進程工作程序用作單獨的線程。 您可以在主服務器和工作服務器之間使用zerorpc(unix套接字在這里非常合適)。 因為工作進程始終受CPU約束並且位於本地,所以您可以禁用服務器與工作進程之間的心跳( Client/Server(heartbeat=0)
)。
我找不到有關如何安全地混合系統線程和gevent的任何詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.