Closed chrisjbillington closed 1 year ago
Right, so turns out this is just not supported by asyncio
. You have to turn the POLLPRI
events into POLLIN
events by wrapping in a select.epoll
:
epoll = select.epoll()
epoll.register(f, select.POLLPRI) # f is a an open file for a GPIO configured for edge triggering
poller = zmq.asyncio.Poller()
poller.register(epoll, zmq.POLLIN) # watch the epoll object instead
events = await poller.poll(5000) # returns as expected when there's a GPIO edge
epoll.poll(0) # Don't forget to clear the epoll object
Not much pyzmq can do about this. Closing.
What pyzmq version?
25.0.2
What libzmq version?
4.3.4
Python version (and how it was installed)
Python 3.11.3 from Arch Linux repositories
OS
Arch Linux
What happened?
I'm using zmq.asyncio.Poller.poll() to wait for
POLLPRI
events on non-zmq file descriptors, which is how edges on GPIOs appear on e.g. raspberry pis. The non-asyncio version works fine:However, I'm seeing a problem with the async version,
poll()
does not return until after the timeout:Below I've given code to reproduce the bug on a regular computer (i.e. my Arch Linux laptop), using a TCP socket to create POLLPRI events instead of GPIOs, for which the outcome is the same. The initial problem with GPIOs was on an embedded ARM computer running Ubuntu core 20.04 with Python 3.8.10, pyzmq 18.1.1, and zmq 4.3.2 from the Ubuntu repositories, so looks like the problem is not very specific to the environment, and is not a recent regression in pyzmq.
Code to reproduce bug
Traceback, if applicable
No response
More info
No response