我想程序从龙卷风转换为ASYNCIO的第一步是使用实际ASYNCIO事件循环作为described here。使用Python ASYNCIO等待GPIO中断
此应用程序在嵌入式Linux机器上运行,我使用通过sysfs/gpio subsystem的GPIO以及我正在等待中断的某些GPIO。我能直接在此整合到龙卷风IOLoop做:
# Register with the queue
self.io_loop.add_handler(
self.gpio._value_file, self._handle_interrupt, self.io_loop._EPOLLPRI | self.io_loop.ERROR
)
在代码块,_value_file
是文件句柄的GPIO可以读取该文件。只要该GPIO上的中断可用,事件EPOLLPRI就会被触发。在龙卷风,这工作得很好。它会在中断到来后立即调用_handle_interrupt
函数。
我的问题是,我一直没能到这个转换为本地ASYNCIO事件循环。在the documentation for watching file descriptors我只找到函数来添加读者和作家,但没有什么可以观察文件描述符上的通用事件掩码。我不能深入到代码自从进入。然而,看着龙卷风层从龙卷风IOLoop调用翻译成ASYNCIO IOLoop好像是这样的话:
def add_handler(self, fd, handler, events):
fd, fileobj = self.split_fd(fd)
if fd in self.handlers:
raise ValueError("fd %s added twice" % fd)
self.handlers[fd] = (fileobj, stack_context.wrap(handler))
if events & IOLoop.READ:
self.asyncio_loop.add_reader(
fd, self._handle_events, fd, IOLoop.READ)
self.readers.add(fd)
if events & IOLoop.WRITE:
self.asyncio_loop.add_writer(
fd, self._handle_events, fd, IOLoop.WRITE)
self.writers.add(fd)
只读和WRITE标志被翻译,所有其他标志被忽略。
有人能证实它是目前无法使用ASYNCIO来监视除了READ文件描述符的任何事件和写入事件?或者我做错了事,实际上有办法吗?