동일한 반복 동안 작업자 풀에 인수를 동적으로 추가하는 방법을 찾고 있습니다. 그래서, 이들 중 일부가 실패 할 경우 즉시 재 처리 할 수 있습니다.동적으로 인수를 작업자 풀에 추가하십시오.
from numpy import random
from multiprocessing import Pool
from time import sleep
def foo(x):
sleep(0.1)
# 50% chance to have a fault
return x, x if random.rand() > 0.5 else -1
random.seed(3) # seed
pool = Pool(2) # process
args = range(5) # arguments to process
for i,(id,x) in enumerate(pool.imap(foo, args)):
print i,x
if x != -1:
args.remove(id)
print args
출력은
0 0
1 1
2 2
3 3
4 -1
[4]
하지만 나는 그것이 같은 반복 내에서
0 0
1 1
2 2
3 3
4 -1
5, 4
[]
싶습니다. 다시 말하면 반복이 완료되면 동일한 풀의 직원에게 새로운지도를 작성하고 싶지 않습니다. 새로운 인수를 직접 푸시하고 싶습니다. 따라서 첫 번째 반복에서 실패하므로 사용 가능한 프로세스를 사용하기 전에 끝까지 기다릴 필요가 없습니다! 간단하게 위의 내 문제는 "foo는"함수를 완료하는 데 약 20 분 정도 소요되며이 동시에 실행 24 개 과정에 걸쳐 퍼져 : 나는
이업데이트 ... 그것은 이해 바랍니다. 한 프로세스가 실패하면 가능한 한 빨리 재 처리해야합니다. 사용 가능한 리소스가있을 때 20 분을 기다리지 않으려 고합니다.
에 날아가 값 : '<>'연산자 * * 사용할 수 없습니다. 그것은 파이썬 2.0의 * deprecated * 이후 python2의 사마귀이고 * python3 +에서 제거되었습니다 *. 이 코드를 사용하면 * 1) 아무도이 코드를 사용하지 않으므로 코드를 다른 사람이 읽을 수 없게 만든다. 2) 코드의 이식성을 떨어 뜨린다. 나는 보통'! ='대신에 그것을 사용할 이유가 없다. – Bakuriu
변경됨 - 나도 싫어 해요! –
내가 아는 한, 실행중인 풀에 새로운 작업을 추가 할 수 없습니다. 질문에서 정확히 무엇을하려하는지 알 수 없습니다. 프로세스가 어떤 인수로 실패하면, 해당 인수를 재 시도하거나 실패를 기록한 다음 다음 단계로 넘어 가고 싶습니까? 의도 한 결과에 따라 동일한 인수를 사용하여 다시 시도하려는 것으로 추측되지만 설명이 도움이 될 것입니다. –