2011-01-24 2 views
6

문제가

아래 스크립트는 최대 하나의 이벤트를 인쇄 한 다음 중지합니다 (문제를 설명하기 위해 작성된 것입니다).변경 사항을 폴링하는 방법은 무엇입니까?

#!/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 개체에 대한 및이를 폴링 개체를 이벤트를보고 트리거 할 수 있도록이를 제어해야합니다. 위의 코드에서 보여 주듯이, 나는 겉으로보기에는 존재하지 않는 이벤트를보고하는 것을 멈출 수 없습니다!

투표 클래스에서 acknowledge_event() 또는 비슷한 것을 찾을 수 없으므로 이벤트가 사라집니다 (단 하나의 이벤트가 멈춘 것 같습니다). Google 검색과이 사이트는 아무 것도 산출하지 않았습니다. 우분투 10.10에서 파이썬 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) 

찾고있는 단일 이벤트가 인쇄됩니다. 폴링 이벤트를 트리거하려면 쓰기 가능한 파일 설명자에 바이트를 쓰면됩니다.