我希望下面的脚本最多可以打印一个事件然后停止(只是为了说明问题而写的)。
#!/usr/bin/env python
from select import poll, POLLIN
filename = "test.tmp"
# make sure file exists
open(filename, "a").close()
file = open(filename, "r+")
p = poll()
p.register(file.fileno(), POLLIN)
while True:
events = p.poll(100)
for e in events:
print e
# Read data, so that the event goes away?
file.read()
但是,它每秒打印约70000个事件。为什么呢?
我写了一个内部使用pyudev.Monitor类的类。除此之外,它还使用poll object轮询fileno()方法提供的fileno以进行更改。
现在我正在尝试为我的类编写一个单元测试(我意识到我应该首先编写单元测试,所以不需要指出它),因此我需要编写自己的fileno()我的模拟pyudev.Monitor对象的方法,我需要控制它,以便我可以触发poll对象来报告事件。正如上面的代码所示,我不能让它停止报告看似不存在的事件!
我在poll类中找不到acknowledge_event()或者类似的东西来让事件消失(我怀疑只有一个事件被某种方式卡住了),搜索谷歌并且这个网站什么也没有产生。我在Ubuntu 10.10上使用python 2.6.6。
答案 0 :(得分:4)
使用管道而不是文件会更好。试试这个:
#!/usr/bin/env python
import os
from select import poll, POLLIN
r_fd, w_fd = os.pipe()
p = poll()
p.register(r_fd, POLLIN)
os.write(w_fd, 'X') # Put something in the pipe so p.poll() will return
while True:
events = p.poll(100)
for e in events:
print e
os.read(r_fd, 1)
这将打印出您正在寻找的单个事件。要触发poll事件,您所要做的就是将一个字节写入可写文件描述符。