W mojej aplikacji muszę oglądać katalog dla nowych plików. Ilość ruchu jest bardzo duża i pojawią się minimum setki nowych plików na sekundę. Obecnie używam ruchliwą pętlę z tego rodzaju idea:Używanie select/poll/kqueue/kevent do oglądania katalogu dla nowych plików
while True:
time.sleep(0.2)
if len(os.listdir('.')) > 0:
# do stuff
Po uruchomieniu profilowanie widzę dużo czasu spędzonego w sen, a ja zastanawiałem się, czy powinienem to zmienić w użyciu sondowania zamiast.
Próbuję użyć jednej z dostępnych klas w select
do odpytywania mojego katalogu, ale nie jestem pewien, czy to faktycznie działa, czy też robię to źle.
dostaję fd do mojego katalogu z:
fd = os.open('.', os.O_DIRECT)
ja potem próbowaliśmy kilka metod, aby zobaczyć, kiedy zmiany katalogów. Jako przykład, jedną z rzeczy, którą próbowałem było:
poll = select.poll()
poll.register(fd, select.POLLIN)
poll.poll() # returns (fd, 1) meaning 'ready to read'
os.read(fd, 4096) # prints largely gibberish but i can see that i'm pulling the files/folders contained in the directory at least
poll.poll() # returns (fd, 1) again
os.read(fd, 4096) # empty string - no more data
Dlaczego poll() działa tak, jak jest więcej informacji do przeczytania? Zakładałem, że zrobi to tylko, jeśli coś zmieni się w katalogu.
Czy to, co próbuję tutaj zrobić, jest możliwe?
Jeśli nie, czy istnieje jakaś lepsza alternatywa dla while True: look for changes
?
Używam BSD, więc inotify nie nadaje się do użytku i wygląda na to, że gamin też nie jest. – gdm
Gamin docs mówi, że można go używać w FreeBSD, ale korzysta z mniej optymalnego rozwiązania ankietowego - może być jeszcze szybszy niż cokolwiek innego, dzięki za to. –