簡體   English   中英

python zerorpc多線程

[英]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.

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