如何zmq.poll()一些套接字和某种变量?

问题描述 投票:0回答:1

我正在尝试轮询几个套接字和一个multiprocessing.Eventdocumentation状态:

Azmq.Socket或任何具有fileno()方法的Python对象,返回有效的文件描述符

这意味着我不能使用我的Event,但是我应该能够使用一个文件(从open(...)io对象(从io库中返回的任何对象返回),但是我没有成功:

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2017.3\helpers\pydev\pydevd.py", line 1683, in <module>
    main()
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2017.3\helpers\pydev\pydevd.py", line 1677, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2017.3\helpers\pydev\pydevd.py", line 1087, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2017.3\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:\work\polldamnyou.py", line 122, in <module>
    p = poller.poll(1000)
  File "C:\WinPython-64bit-3.6.3.0Qt5\python-3.6.3.amd64\Lib\site-packages\zmq\sugar\poll.py", line 99, in poll
    return zmq_poll(self.sockets, timeout=timeout)
  File "zmq\backend\cython\_poll.pyx", line 143, in zmq.backend.cython._poll.zmq_poll
  File "zmq\backend\cython\_poll.pyx", line 123, in zmq.backend.cython._poll.zmq_poll
  File "zmq\backend\cython\checkrc.pxd", line 25, in zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: Unknown error

我已经找到了same question,但解决方法是使用另一个避免此问题的套接字。我很好奇,希望看到这个方法。有没有人知道除了套接字以外可以在zmq.Poller中使用哪种对象?

python-3.x zeromq polling pyzmq
1个回答
0
投票

如果从未使用过ZeroMQ,在这里您可以先看看"ZeroMQ Principles in less than Five Seconds",然后再深入研究更多细节]]


Q

what对象的种类可以在套接字之外使用[> C0]吗?”

欢迎来到零之禅的美丽土地。已发布的API和zmq.Poller ReadTheDocs

都清晰无误:

pyzmq函数提供了一种机制,使应用程序可以在一组套接字上以级别触发的方式多路复用输入/输出事件。 items参数指向的数组的每个成员都是一个[[zmq_poll()结构。 zmq_pollitem_t参数指定items数组中的项目数。 nitems

结构的定义如下:zmq_pollitem_t

对于每个typedef struct { void //*socket//; int //fd//; short //events//; short //revents//; } zmq_pollitem_t; 项目,对于事件中指定的事件,zmq_pollitem_t应检查套接字引用的ØMQ套接字或文件描述符zmq_poll()指定的标准套接字。如果将套接字和fd都设置在单个fd中,则套接字引用的ØMQ套接字应优先,而zmq_pollitem_t的值应被忽略。对于每个fd项目,zmq_pollitem_t应首先清除zmq_poll()成员,然后通过将与revents成员中的事件条件相对应的位置1,指示发生的任何请求的事件。如果在任何revents项目上都没有发生所请求的事件,则zmq_pollitem_t应等待zmq_poll()毫秒,以便在任何所请求的项目上发生事件。如果超时值为0,则timeout应立即返回。如果zmq_poll()的值为-1,则timeout应无限期阻塞,直到在至少一个zmq_poll()上发生请求的事件为止。


最后但并非最不重要的是,该API是明确警告实施的:

[zmq_pollitem_t

函数可能是

使用zmq_poll()以外的操作系统接口实现或模拟,并且可能是这些接口的限制,以本文档中未定义的方式
解决方案:

对于任何具有

poll()

版本的对象,该对象不符合具有普通poll()文件描述符的给定强制性属性,请实现这样的强制性属性mediated-proxy,已发布的API规范,或者不与fd一起使用以成功进行API调用。没有第三种选择。
© www.soinside.com 2019 - 2024. All rights reserved.