2011-01-24 8 views
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() 

ただし、約70000イベント/秒を出力します。どうして?

背景

私は内部pyudev.Monitorクラスを使用するクラスを書きました。とりわけ、poll objectを使用してfileno()メソッドによって提供されたfilenoを変更するかどうかをポーリングします。

私はクラスの単体テストを書こうとしています(単体テストを書くことになっているので、それを指摘する必要はありません)ので、自分のファイルを書く必要があります私のモックpyudev.Monitorオブジェクトのために、私はイベントを報告するためにポーリングオブジェクトをトリガーできるようにそれを制御する必要があります。上記のコードが示すように、私はそれが一見存在しないイベントを報告するのを止めることはできません!

私はpollクラスでは、イベントを消してもらえません(私は何とか止まっているイベントが1つしかないと思われます)、Googleを検索してこのサイトに何も表示されていません。私はUbuntu 10.10でPython 2.6.6を使用しています。

答えて

3

ファイルではなくパイプを使用する方がよいでしょう。代わりにこれを試してください:

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

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

関連する問題