2011-07-17 4 views
0

다음과 같은 문제에 대한 모든 종류의 솔루션을 시도해 왔습니다. 아무 소용이 없습니다.이벤트 구동 스레드 생성

많은 수의 (파이썬) 모듈/스크립트와 고유 한 스크립트 인 K.py가 있습니다.

K.py가 실행되면 국가 정보와 같은 정보가 생성됩니다. 이제 다른 모듈 (수백) 사이에는 입력으로 전달 된 K.py에 의해 생성 된 정보 (이 예제의 경우 국가 이름)로 실행할 수있는 모듈이 있습니다. 재귀 적으로, 위의 각 모듈은 다른 정보 (마을 이름, 번지 수 등)를 생성하고 다른 모듈의 입력으로 사용될 수 있습니다. 물론 이것은 스크립트의 2 진 트리가 실행되게합니다.

참고 사항.

  • 모듈/스크립트 (수백) 위 그건 (내가 모든 모듈이 실행을 완료 한 판결을 넣을 수 있어야한다
  • (그들은 어떠한 방법으로-간 의존하지 않는) 독립적으로 실행할 수 있습니다 실행중인 K.py는 실행 모듈의 트리거 된 이진 트리가 '결합'될 때까지 차단해야합니다.

  • 정보 I 및 실행 가능한 스크립트 S (즉, S가 입력으로 실행될 수 있음)에 대해 새 스레드를 작성하기로 결정한 경우, 지수 스레드 수 (아니요 ?)

파이썬 스레드 (모든 API)를 사용하여 솔루션을 '안전하게'구현하려면 어떻게해야합니까? (의사 코드?)

미리 감사드립니다.

답변

2

이 문제를 해결하는 일반적인 방법은 작업자 큐를 생성하고 거기에 단일 작업을 저장하는 것입니다. 따라서 한 스레드에서 수행해야하는 작업을 프로그램 방식으로 표현해야합니다.

"thread"풀 (16.3.1.5 참조)과 다중 스레드 대기열을 제공하는 multiprocessing package을 사용할 수 있습니다.

이제 모든 프로세스가 대기열에서 하나의 작업을 가져와 실행합니다. 대기열에 새로운 작업을 추가 할 수도 있습니다. 작업이 완료되면 다음 작업을 수행합니다. 대기열이 비어 있으면 완료됩니다.

GIL과 다중 스레드 Python 프로그램이있는 CPython이 최소한 IO 나 기타 차단 활동이 큰 경우에만 유용하기 때문에이 방법은 다중 처리 패키지를 사용합니다.

+0

감사합니다. 멀티 프로세싱 패키지를 사용해보고 있습니다. (나는 풀의 put (..)이 피클 할 필요가있는 것처럼 '일'을 나타내는 다른 방법을 생각하고있다.) 감사합니다. – dop

+0

풀 put() (그런 방법이 보이지 않습니까?)과 절임의 의미는 확실하지 않습니다. 개인적으로 나는 대기열에서 첫 번째 요소를 제거하고 처리하는 while 루프를 만들 것입니다. 대기열이 비어 있으면 모든 스레드가 반환되고 완료됩니다. 큐를 생성하고 큐에 첫 번째 작업을 넣은 다음 풀을 사용하여 프로세스를 시작합니다. – Voo

관련 문제