6

問題

以下のスクリプトは、最大で1つのイベントを出力してから停止することを期待していました(問題を説明するためだけに書かれています)。

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

ただし、1秒あたり約70000イベントを出力します。なんで?

バックグラウンド

pyudev.Monitorクラスを内部で使用するクラスを作成しました。特に、 pollオブジェクトを使用して変更についてfileno()メソッドによって提供されたfilenoをポーリングします。

今、クラスの単体テストを作成しようとしています(最初に単体テストを作成することになっているので、指摘する必要はありません)。したがって、独自のfileno()メソッドを作成する必要があります。 pyudev.Monitorオブジェクトをモックします。これを制御して、ポーリングオブジェクトをトリガーしてイベントを報告できるようにする必要があります。上記のコードが示すように、存在しないように見えるイベントの報告を停止することはできません。

ポーリングクラスでacknowledge_event()などを見つけることができず、イベントを終了させることができます(何らかの理由でスタックしているイベントが1つだけあると思われます)、googleを検索すると、このサイトは何も生成しませんでした。Ubuntu10.10でPython2.6.6を使用しています。

4

1 に答える 1

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)

これにより、探している単一のイベントが印刷されます。ポーリングイベントをトリガーするには、書き込み可能なファイル記述子に1バイトを書き込むだけです。

于 2011-01-24T14:57:24.110 に答える