我正在尝试轮询几个套接字和一个multiprocessing.Event
documentation状态:
A
zmq.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
中使用哪种对象?
如果从未使用过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调用。没有第三种选择。