2009-07-22 3 views
5

내 앱에서 새 파일의 디렉토리를 볼 필요가 있습니다. 트래픽 양은 매우 커서 초당 최소 수백 개의 새 파일이 표시됩니다. 현재 내가 생각이 이런 종류의 바쁜 루프를 사용하고 있습니다 :select/poll/kqueue/kevent를 사용하여 새 파일의 디렉토리를 확인하십시오.

while True: 
    time.sleep(0.2) 
    if len(os.listdir('.')) > 0: 
    # do stuff 
나는 잠에서 보낸 시간을 많이보고 있어요 프로파일 링을 실행 한 후

, 나는이 폴링을 사용하도록 변경해야하는지 궁금 해요 대신.

select에서 사용 가능한 클래스 중 하나를 사용하여 내 디렉토리를 폴링하려하지만 실제로 작동하는지 또는 잘못하고 있는지 확실하지 않습니다. 그때 때 디렉토리 변경 사항을 확인하기 위해 여러 가지 방법을 시도했습니다

fd = os.open('.', os.O_DIRECT) 

:

나는 내 디렉토리에 대한 FD를 얻을. 예를 들어, 내가 노력 것들 중 하나였다

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 

왜 읽을 자세한 내용은이 같은 여론 조사() 연기는? 디렉토리에서 뭔가가 변경된 경우에만 그렇게한다고 가정했습니다.

여기서도 가능한 일을하고 있습니까?

그렇지 않은 경우 while True: look for changes에 대한 다른 더 나은 대안이 있습니까?

답변

1

프로파일 링을 실행 한 후 많은 시간을 잠자는 동안 보았습니다. 대신 폴링을 사용하도록 변경해야합니다.

do 동기 폴링과 같이 일정한 간격으로 상태를 확인합니다. sleep에 "보낸 시간"에 대해 걱정하지 마십시오. CPU 시간을 먹지 않습니다. 그것은 단지 요구 된 타임 아웃 후에 프로세스를 깨우는 제어를 운영체제로 넘깁니다.

운영 체제에서 제공하는 파일 시스템 변경 알림을 수신하는 라이브러리를 사용하여 비동기 이벤트 루프를 고려할 수 있지만이 특정 상황에서 실제 이점이 있으면 먼저 고려하십시오.

3

gamin 또는 inotify (pyinotify를 검색하면 새 사용자로 하이퍼 링크 하나만 게시 할 수 있습니다 ...)와 같이 파일 변경을 모니터링하는 라이브러리 중 하나에 파이썬 래퍼를 사용하지 않는 것이 좋습니다. 커널 인터페이스를 사용하여 C 레벨에서 더 빨리 수행하고 저수준 작업을 완료했습니다 ...

+0

BSD를 사용하고 있으므로 inotify를 사용할 수 없으며 gamin도 아닌 것 같습니다. – gdm

+0

gamin docs는 FreeBSD에서 사용 가능하지만 덜 최적 인 폴링 솔루션을 사용한다고 말합니다. 그래도 여전히 다른 어떤 것보다 빠를 수도 있습니다. –

6

FreeBSD 및 따라서 Mac OS X는 kqueue라는 inotify의 유사점을 제공합니다. 자세한 정보는 FreeBSD 시스템에 man 2 kqueue를 입력하십시오. Freebsd의 kqueue에 대해서는 PyKQueue가 http://people.freebsd.org/~dwhite/PyKQueue/에 있습니다. 불행히도 적극적으로 유지 관리되지 않으므로 귀하의 마일리지가 다를 수 있습니다.

+1

아, 감사합니다. 이 글을 쓸 때 디렉토리를 보는 것에 대한 모든 의문점들은 OS X 답변을 제공하지 않습니다. – Purrell

0

select.kqueue - 사용하지는 않았지만 kqueue는 BSD에서 올바른 인터페이스라고 생각합니다. 따라서 파일/디렉토리를 모니터링하고 변경할 때만 호출 할 수 있습니다.

0

이것을 처리해야하는 라이브러리와 셸 도구를 작성했습니다.

http://github.com/gorakhargosh/watchdog

있지만은, kqueue는 테스트하고 발생할 수있는 성능 문제를 체크 아웃 할 수 있다면 나는 감사하겠습니다 디렉토리 을 모니터링하는 매우 헤비급 방법입니다. 패치도 환영합니다.

HTH.