2012-06-08 3 views
1

네트워크를 통해 많은 쿼리를 수행해야하는 프로그램이 있으므로 작업을 병렬화하는 것이 좋습니다. 정말 내가/O 바운드, 단순히하고 있어요된다병렬 스레드 수를 동적으로 변경하십시오.

for i in range(options.workers): 
    w = Worker(queue, output_queue, options.site) 
    w.setDaemon(True) 
    w.start() 

for i, dataset_metadata in enumerate(datasets_metadata): 
    queue.put((i+1, dataset_metadata)) 

queue.join() 

options.workers 명령 줄에서 온다. 이제 동적으로 작품 수를 변경하고 싶습니다.

첫 번째 질문 : queue.join 이후에 근로자를 추가하는 방법은 무엇입니까?

두 번째 질문 : 런타임에 최적의 작업자 수를 계산하는 방법은 무엇입니까? 나는 스피드 작업/시간을 모니터해야한다고 생각하는데,이 비율이 변하지 않을 때까지 작업자 수를 늘려야한다.

+0

파이썬에서 스레드를 사용하는 것이 단점임을 이해하십시오. [GIL] (http://wiki.python.org/moin/GlobalInterpreterLock)에 대해 읽어보십시오. – Vikas

+0

@Vikas : 내가 말했듯이 내 문제는 입출력이 한정되어있다. –

답변

1

당신은 아마 시작하고 노동자들에게 자신을 중지하지만, 당신이 필요로하는 기능의 대부분은 이미 아마도 수 :

  • multiprocessing.dummy 모듈은 스레드 대신 프로세스로 구현, multithreading와 같은 API를 보냅니다.
    즉, 이미 구현 된 작업자의 Pool을 사용할 수 있으며 어떤 시점에서 필요하면 스레딩에서 멀티 프로세싱으로 쉽게 전환 할 수 있습니다.
  • concurrent.futures API는 더욱 향상된 동시성 모델을 제공합니다. python3.2 +에서는 표준 라이브러리에 있지만 이전 버전에는 backports이 있습니다.
관련 문제