저는 파이썬의 multiprocessing 모듈과 공유 메모리를 가지고 놀고 있습니다. Process
과 공유 메모리 객체를 사용할 수 있지만 Pool
과 공유 메모리 객체를 사용할 수 없습니다. 내 Pool
콜백을 추가하고 콜백이 호출되지 않는 것 같습니다.Pool을 사용하여 공유 메모리 객체를 변경할 수 없습니다.
from multiprocessing import Array, Pool, Process
def flip(x,a):
a[x] = 0 if a[x] else 1
return (x, a[x])
def cb(result):
print(result)
if __name__ == '__main__':
# size of array
N = 10
# shared array - N bytes - unsynchronized - initialized to zeros
a = Array('B', N, lock=False)
# flip values to ones using Process
processes = [Process(target=flip, args=(x, a)) for x in range(N)]
for p in processes: p.start()
for p in processes: p.join()
print([a[i] for i in range(N)])
# flip values back to zeros using Pool
pool = Pool(processes=4)
for x in range(N):
pool.apply_async(flip, args=(x, a), callback=cb)
pool.close()
pool.join()
print([a[i] for i in range(N)])
나는 내 공유 배열 callback
인쇄하고 다시 배열 모두 0 단일 선 다음, 모두 1 회 인쇄 얻을 것으로 기대하지만, 대신를 얻을 것;
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Pool
은 작업을 실행하지 않는 이유는 무엇입니까?
최소한의 예제를 위해 공유 메모리를 사용합니다.
def f(x):
return x
def cb(result):
print('cb',result)
if __name__ == '__main__':
pool = Pool(processes=4)
pool.apply_async(f, range(10), callback=cb)
pool.close()
pool.join()
나는 0에서 9까지의 숫자를 별도의 줄에 인쇄 할 것을 기대하지만 아무 것도 출력하지 않습니다.
바로 위의 apply_sync
호출을이 코드로 바꿉니다.
pool.apply_async(f, args=[10], callback=cb)
나는 range(10)
이 [1,2,3]
는, [(1),(2),(3)]
가, 또는 ([1],[2],[3])
더 출력을 얻을 수없는 [10]
로 교체 출력
cb 10
를 얻을.
(x) (range) : pool.apply .... 플립을 4 번 적용 하시겠습니까? 1 - 0 - 1 - 0 - 1 (1로 끝남) – chapelo
@chapelo - 4는 풀에있는 작업자 수입니다. 'for '는해야 할 10 가지 작업을 만들어야합니다. 'cb'는 절대로 호출되지 않기 때문에 실행중인 작업이없는 것 같습니다. – CAB
풀 (pool)이 자동으로 작업자들 사이에서 작업을 나누고, args를 잘못 전달하고 있습니다. – Aaron