2017-09-14 1 views
0

현재 사용중인 풀에서 작업자 수를 변경하려고합니다. 내 현재의 생각이 문제는 그냥 그렇게 노동자와 손실 아직 some_infinite_generator에서받은되었고, 처리되지 않은 마지막 항목을 종료한다는 것입니다이동 중에 다중 처리 풀 작업자 수를 변경하는 방법

while True: 
    current_connection_number = get_connection_number() 
    forced_break = False 
    with mp.Pool(current_connection_number) as p: 
     for data in p.imap_unordered(fun, some_infinite_generator): 
      yield data 
      if current_connection_number != get_connection_number(): 
       forced_break = True 
       break 
    if not forced_break: 
     break 

입니다. 이 일을하는 표준 방법이 있습니까?

편집 : some_infinite_generator 내부에서 인쇄를 시도했는데 p.imap_unordered 요청이 처리되었습니다. 2 개의 풀 작업자가있는 1565 개 항목이 처리되기 전에도 생성기에서 요청한 항목 수를 어떻게 제한합니까? 위 코드를 사용하여 단 2 개 항목 만 연결하면 번호가 변경됩니다.

답변

0

문제는 Pool이 별도의 스레드에서 내부적으로 생성 프로그램을 사용한다는 점입니다. 그 논리를 제어 할 방법이 없습니다.

당신이 할 수있는 일은 Pool.imap_unordered 메서드에 생성기의 일부분을 공급하고 사용 가능한 연결에 따라 크기를 조정하기 전에 생성기를 사용하게하는 것입니다. 스케일링마다 반복하는 대신 모든 덩어리를 발생하지만 CHUNKSIZE 값의 미세 조정의 비트와 함께 당신은 쉽게 바로 그것을 얻을 수

CHUNKSIZE = 100 

while True: 
    current_connection_number = get_connection_number() 
    with mp.Pool(current_connection_number) as p: 
     while current_connection_number == get_connection_number(): 
      for data in p.imap_unordered(fun, grouper(CHUNKSIZE, some_infinite_generator)): 
       yield data 

def grouper(n, iterable): 
    it = iter(iterable) 
    while True: 
     chunk = tuple(itertools.islice(it, n)) 
     if not chunk: 
      return 
     yield chunk 

그것은 조금 덜 최적입니다.

grouper recipe.

관련 문제