Python Epoll 有一个名为 epoll.unregister 的函数,它从 epoll 对象中删除一个已注册的文件描述符。有谁知道Kqueue中与此类似的功能是什么。对于 kqueue,我只能找到如何删除事件。
问问题
364 次
1 回答
2
您用于kqueue.control
注册或注销事件。
一个例子:
import select
import os
os.mkfifo('my.fifo')
f = os.open('my.fifo', os.O_RDONLY|os.O_NONBLOCK)
try:
kq = select.kqueue()
# Add FD to the queue
kq.control([select.kevent(f, select.KQ_FILTER_READ, select.KQ_EV_ADD|select.KQ_EV_ENABLE)], 0)
# Should break as soon as we received something.
i = 0
while True:
events = kq.control(None, 1, 1.0) # max_events, timeout
print(i, events)
i += 1
if len(events) >= 1:
print('We got:', os.read(f, events[0].data))
break
# Remove FD from the queue.
kq.control([select.kevent(f, select.KQ_FILTER_READ, select.KQ_EV_DELETE)], 0)
# Should never receive anything now even if we write to the pipe.
i = 0
while True:
events = kq.control(None, 1, 1.0) # max_events, timeout
print(i, events)
i += 1
if len(events) >= 1:
print('We got:', os.read(f, events[0].data))
break
finally:
os.close(f)
os.remove('my.fifo')
您还可以检查 kqueue 的测试用例以了解它是如何使用的。(和 一样select()
,文件描述符也可以是任何带有fileno()
方法的 Python 对象。)
于 2013-09-02T16:30:10.353 回答