3

我正在寻找使用 Majordomo API pyzmq-mdp。客户端存储库中的示例是我不太了解的内容。

在 myclient.py 中,该示例在不使用 MDPClient API 的情况下手动创建了一个套接字。更糟糕的是,mdp_request 方法用于发出请求。但到目前为止我试过这个:

class Client(MDPClient):

    def on_timeout(self):
        print "Client Timed out."

def main():
    context = zmq.Context()
    mdp_client = Client(context, "tcp://127.0.0.1:8888", SERVICE)
    try:
        mdp_client.request(["hello"], timeout=5000)
    except RequestTimeout:
        print "Timed Out."


if __name__ == '__main__':
    main()

我只是在运行客户端。没有经纪人。但这不会引发 RequestTimeout 异常。我有以下疑问:

  • 为什么示例没有实现 MDPClient API?
  • 当有可用的请求方法时, mdp_request 方法的目的是什么?
  • 我的方法有什么问题?

我错过了一些明显的东西吗?请给予一些指导。

4

1 回答 1

3

根据你的问题:

当有可用的请求方法时, mdp_request 方法的目的是什么?

因为它是用代码编写的:

mdp_request 是同步MDP 请求

MDPClient 类是zmq.REQ 套接字的异步封装,旨在集成到 pyzmq 的异步 IOLoop 中。

我的方法有什么问题?

我正在努力解决同样的问题。在检查了test_client.py之后,我能够用这样的例子来解决它:

import zmq
from zmq.eventloop.ioloop import IOLoop
from mdp.client import MDPClient

class MyClient(MDPClient):
    def on_message(self, msg):
        print("Received:", repr(msg))
        IOLoop.instance().stop()
        return

    def on_timeout(self):
        print('TIMEOUT!')
        IOLoop.instance().stop()
        return

if __name__ == '__main__':
    context = zmq.Context()
    client = MyClient(context, 'tcp://127.0.0.1:5555', b'echo')
    client.request(b'Hello world', timeout=3000)
    IOLoop.instance().start()
    client.shutdown()
于 2014-09-07T11:37:05.297 回答