Nella mia app ho bisogno di guardare una directory per i nuovi file. La quantità di traffico è molto grande e ci sarà un minimo di centinaia di nuovi file al secondo che appaiono. Attualmente sto usando un ciclo occupato con questo tipo di idea:Utilizzando select/poll/kqueue/kevent per guardare una directory per i nuovi file
while True:
time.sleep(0.2)
if len(os.listdir('.')) > 0:
# do stuff
Dopo l'esecuzione di profilazione che sto vedendo un sacco di tempo trascorso nel sonno, e mi chiedo se dovrei cambiare questa opzione per utilizzare il polling anziché.
Sto provando a utilizzare una delle classi disponibili in select
per eseguire il polling della mia directory, ma non sono sicuro che funzioni effettivamente, o se sto semplicemente facendo qualcosa di sbagliato.
ottengo una fd per la mia directory con:
fd = os.open('.', os.O_DIRECT)
Ho poi provato diversi metodi per vedere quando le modifiche alla directory. A titolo di esempio, una delle cose che ho provato è stato:
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
Perché poll() che agisce come se non ci sono più informazioni da leggere? Supponevo che avrebbe fatto solo se qualcosa fosse cambiato nella directory.
È quello che sto cercando di fare anche qui possibile?
In caso contrario, esiste un'alternativa migliore a while True: look for changes
?
Sto usando BSD, quindi inotify non è utilizzabile e sembra che Gamin non lo sia. – gdm
Il gamin docs dice che è utilizzabile su FreeBSD ma usa una soluzione di polling meno ottimale - potrebbe essere comunque più veloce di qualsiasi altra cosa nonostante –