2011-01-24 22 views
6

Problem

Spodziewałem się, że poniższy skrypt wydrukuje maksymalnie jedno zdarzenie, a następnie zatrzyma się (jest napisane tylko w celu zilustrowania problemu).Jak działa odpytywanie pliku pod kątem zmian?

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

Jednak drukuje około 70000 zdarzeń na sekundę. Czemu?

Tło

Pisałem klasy, która używa klasy pyudev.Monitor wewnętrznie. Między innymi, sonduje fileno dostarczone przez metodę fileno() zmian za pomocą poll object.

Teraz próbuję napisać test jednostkowy dla mojej klasy (zdaję sobie sprawę, że mam najpierw napisać test jednostkowy, więc nie muszę tego zaznaczać) i dlatego muszę napisać własne filogeniczne () dla mojego próbnego obiektu pyudev.Monitor i muszę go kontrolować, aby móc wywołać obiekt ankiety, aby zgłosić zdarzenie. Jak pokazuje powyższy kod, nie mogę przestać zgłaszać pozornie nieistniejących zdarzeń!

Nie mogę znaleźć żadnego potwierdzenia() lub podobnego w klasie odpytywania, aby zdarzenie zostało przerwane (podejrzewam, że jest tylko jedno zdarzenie, które utknęło w jakiś sposób), wyszukując google i ta strona niczego nie dała. Używam Pythona 2.6.6 na Ubuntu 10.10.

Odpowiedz

3

Powodzenia przy użyciu rur, a nie plików. Spróbuj zamiast tego:

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

Spowoduje to wydrukowanie pojedynczego zdarzenia, którego szukasz. Aby wywołać zdarzenie ankiety, wystarczy napisać bajt do deskryptora pliku, który można zapisać.

Powiązane problemy