Python客户端调用中的双向ZeroRPC导致AssertionE

2024-06-25 07:11:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我的设置有一个节点.js生成子进程,它使用Python对象创建一对双向ZeroRPC会话。在

python方面与此类似:

class MyClass:
    def __init__(self, socketpath):
        self.client = zerorpc.Client()
        self.client.connect(socketpath)

    def sendtoclient(self, msg):
        self.client.receiveMessage(msg)

if __name__ == '__main__':
    zpc = zerorpc.Server(MyClass(sys.argv[1]))
    zpc.bind(sys.argv[1] + "_python")
    zpc.run()

在节点.js子客户机可以调用Python服务器上的方法,但该服务器中的客户机不能在节点.js子服务器没有得到异常:

^{pr2}$

Python类中的客户机是否需要作为gevent派生,然后在需要时调用其receiveMessage方法?或者我忽略了其他的把戏吗?在


Tags: self服务器client客户机节点defsysjs
1条回答
网友
1楼 · 发布于 2024-06-25 07:11:48

经过一番试验,Gevent文档中的一些例子给出了一个可行的解决方案。我采用的解决方案是创建一个gevent队列,从服务器端填充并在循环中从单独的Greenlet输出。所以在我的服务器文件中,我添加了:

import gevent
from gevent.queue import Queue, Empty

messagesOut = Queue()
def clientWorker(address):
    client = zerorpc.Client()
    if (None != client):
        client.connect(address)
        while True:
            try:
                messages = messagesOut.get()
                client.passMessages(messages) # a method on the Node.js-side ZeroRPC server
            except: # Empty could be thrown here if you're interested
                pass
            finally:
                gevent.sleep(0)

MyClass中,它的初始化更改为将对队列的引用保留为self.outbox(实际上,我可以在每次访问它时使用global)。当需要发送异步消息时,MyClass调用self.outbox.put(messages)。在

然后在下面创建ZeroRPC实例时,我生成了每个实例:

^{pr2}$

这样做解决了我的问题作为一个概念的证明。在

相关问题 更多 >