python - 轮询文件更改如何工作?

标签 python polling udev

问题

我希望下面的脚本最多打印一个事件然后停止(编写它只是为了说明问题)。

#!/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 以进行更改。 .

现在我正在尝试为我的类(class)编写单元测试(我意识到我应该先编写单元测试,因此无需指出),因此我需要编写自己的 fileno()我的模拟 pyudev.Monitor 对象的方法,我需要控制它以便我可以触发 poll 对象来报告事件。如上面的代码所示,我无法让它停止报告看似不存在的事件!

我在轮询类中找不到 acknowledge_event() 或类似的东西来使事件消失(我怀疑只有一个事件以某种方式卡住了),搜索谷歌和这个网站没有产生任何结果。我在 Ubuntu 10.10 上使用 python 2.6.6。

最佳答案

使用管道比使用文件更幸运。试试这个:

#!/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)

这将打印出您要查找的单个事件。要触发轮询事件,您所要做的就是向可写文件描述符写入一个字节。

关于python - 轮询文件更改如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4782756/

相关文章:

python - 返回变量以及渲染模板

python - 如何使用前一列中两列的键创建一个新的 pandas 数据框?

python - pyglet/avbin 错过了视频的开头和结尾

c# - 如何将时基轮询与等待任务结合起来

javascript - jQuery AJAX 轮询 JSON 响应,基于 AJAX 结果或 JSON 内容进行处理

linux - 插入 USB 设备时运行某些程序不起作用

python - 自定义上下文处理器在 Django 1.8.2 中不起作用

java - 使用 JSF 和 PrimeFaces 进行自适应轮询

linux - ftdi d2xx 与 Linux 上的 ftdi_sio 冲突 - 如何自动删除 ftdi_sio

linux - 暂停后在 Xorg 环境中恢复键盘设置