使用 python asyncio 循环轮询具有不同事件掩码的 fds

Poll fds with different event masks using python asyncio loop

提问人:sergs 提问时间:9/4/2023 最后编辑:sergs 更新时间:9/4/2023 访问量:35

问:

是否可以在 python3.8(.13)/linux 中使用 asyncio 库,使用轮询选择器轮询具有不同事件掩码的不同 fd。

我需要在一个 fd 和 POLLPRI |POLLERR 在另一个 fd 上,可能吗?

这就是我能够在 ONE fd 上收听的方式:

import asyncio
import selectors
import select

class CustomPollSelector(selectors.PollSelector):
    _selector_cls = select.poll
    _EVENT_READ = select.POLLPRI | select.POLLERR
    _EVENT_WRITE = select.POLLOUT

selector = CustomPollSelector()
event_loop = asyncio.SelectorEventLoop(selector)
.
.
# listen for select.POLLPRI | select.POLLERR events on a fd_1 fd
event_loop.add_reader(fd_1, read_data_cb)
.
.
.
# TODO: how to listen ONLY on POLLIN events on another fd?
.
.
.
event_loop.run_forever()

我可以使用选择器注册另一个具有适当事件掩码的 fd:

selector.register(fd_2, select.POLLIN)

但是如何将此注册合并到event_loop中,据我了解,对于每个 fd 都有一个关联,当指定事件发生时要调用一个handler_cb,如何在库代码之外创建这样的关联?这看起来不是一个好主意......

这很奇怪,但看起来 asyncio 库没有提供 linux poll/epoll 的全部功能。

Python python-asyncio epoll

评论

0赞 Paul Cornelius 9/5/2023
您是否尝试过简单地在循环中添加第二个阅读器,例如?您可以使用 Python 代码让这些事件处理程序做任何您想要的事情,因此没有理由让 asyncio 库应该(或可以)已经这样做。我不明白你说的“在库代码之外创建关联”是什么意思。你有文件描述符和事件处理程序(python 函数),还有什么?你在担心什么?event_loop.add_reader(fd_2, some_other_cb)
0赞 sergs 9/6/2023
@PaulCornelius 当然,我可以使用 event_loop.add_reader() 添加第二个读取器,但在这种情况下,将在 select 时调用 cb。POLLPRI 和/或选择。POLLERR 事件,但我需要在 fd 上的另一种类型的 i/o 事件上调用 cb。

答: 暂无答案