2016-09-10 4 views
2

5 개의 웹 사이트를 동시에 스레드를 사용하여 크롤링하는 기본 크롤러를 연구 중입니다. 각 사이트마다 새 스레드를 만듭니다. 쉘에서 프로그램을 실행하면 출력 로그에 모든 5 개의 스레드가 예상대로 실행됨을 나타냅니다. 그러나이 프로그램을 supervisord 프로그램으로 실행하면 로그에 매 2 개의 스레드 만 실행됩니다. 로그는 모든 5 개의 스레드가 시작되었지만 동일한 두 개만 실행 중이며 나머지는 멈추어 있음을 나타냅니다. 이 불일치가 쉘에서 실행될 때와 감독자에서 실행될 때 왜 이러한 불일치가 발생하는지 이해할 수 없습니다. 내가 고려하지 않은 것이 있습니까?슈퍼 바이저에서 실행중인 스레드가 없습니다

for sid in entries: 
    url = entries[sid] 
    threading.Thread(target=self.crawl_loop, \ 
        args=(sid, url)).start() 

UPDATES : 여기

는 스레드 생성하는 코드 코멘트에 tdelaney에 의해 제안 을, 나는 supervisord 구성에서 작업 디렉토리를 변경하고 지금은 모든 스레드가 실행되고있다 예상대로 크롤러 파일 디렉토리에 작업 디렉토리를 설정하면 문제가 해결되는 이유가 아직도 이해가되지 않습니다. 아마도 관리자가 프로세스를 관리하는 방법을 알고있는 사람이 설명 할 수 있습니까?

+0

항목은 어디에서 왔으며 로그는 어디로 이동합니까? supervisord를 사용할 때 다른 사용자 이름과 현재 작업 디렉토리가 있으며 생각보다 다른 파일을 사용할 가능성이 있습니다. – tdelaney

답변

1

AFAIK 파이썬 스레드는 스레드로부터 안전하지 않기 때문에 스레드를 제대로 처리 할 수 ​​없습니다. 코드의 동시 실행을 시뮬레이션 할 수있는 기능을 제공합니다. 코드는 여전히 1 개의 코어만을 사용합니다.

https://wiki.python.org/moin/GlobalInterpreterLock

https://en.wikibooks.org/wiki/Python_Programming/Threading

따라서 이상의 프로세스/스레드를 생성하지 않는 것이 가능하다

.

제 생각에는 다중 처리를 사용해야합니까?

https://docs.python.org/2/library/multiprocessing.html

+0

멀티 프로세싱을 사용해 보았습니다. 같은 결과.아직도 모든 스레드가 쉘에서 'python crawler.py'로 실행될 때 실행되는 이유를 이해할 수 없지만 supervisord에서 작업으로 추가 할 때 항상 같은 2 개의 스레드 만 항상 실행됩니다. – conquester

+0

실행중인 스레드 수를 정확하게 기록하는 방법을 알려 주시면 도움이 될 것 같습니까? 즉, 실행중인 스레드의 수를 어떻게 결정합니까? –

+0

스레드가 미리 결정됩니다. 5 웹 사이트 5 스레드. 또한 새로운 개발 상황을 반영하여 질문을 업데이트했습니다. – conquester

0

그냥 아주 비슷한 문제가 발생했습니다.

내 경우에는 직렬 장치 (/ dev/ttyUSB0의 Arduino nano)를 듣는 데 전념 한 스레드를 사용하여 저전력 컴퓨터 (RaspberryPi)에서 작업하고있었습니다. 코드가 명령 행에서 완벽하게 작동했지만 - 감독자 아래에서 직렬 판독 스레드가 정지했습니다.

해킹 (그리고 여기에 모든 옵션을 시도) 후, 나는 비 버퍼 모드에서 파이썬을 실행 해 보았고 문제를 해결할 수있었습니다! https://stackoverflow.com/a/17961520/741316에서 아이디어를 얻었습니다.

본질적으로 나는 단순히 -u 플래그가있는 파이썬을 호출했습니다.