저는 많은 작업자로 쉽게 나눌 수있는 CPU 비싼 계산을 수행하고 있습니다. 그러나 결국 결과에 합류해야합니다. 문제는 여러 격리 된 프로세스를 사용할 때 공유 메모리를 사용할 수 없으며 자식에서 부모로 계산 된 출력을 보내는 유일한 방법은 multiprocessing.Queue
, multiprocessing.Manager
또는 multiprocessing.Pool
입니다. 이 모든 접근 방식은 객체를 pickle 처리하고 일종의 IPC를 사용하여 객체를 전송합니다.다중 처리를 사용하여 부모에게 거대한 사전 반환
나는 작업의 모든 다른 부분을 시간을 잰다. 그리고 데이터를 처리하는 것이 더 빠르다. 그러나 객체를 얻는 것은 너무 느리고 다중 처리를 사용하지 않는다면 항상 빠르다.
multithreading library
을 사용할 때 공유 메모리와 동일한 수준을 얻을 수있는 방법이 있습니까? 이 보일 것입니다, 그래서, 내가 그것에 대해 딜 모듈을 사용하는 것이 좋습니다
process = [None]*numProcess
#List where the processes should write in memory the output.
results = [None]*numProcess
m = float(len(nflow))/numProcess
nflow_for_process = [nflow[int(m*i):int(m*(i+1))] for i in range(numProcess)]
for i in xrange(numProcess):
p = Process(target=self.gatherFlowsProcess, args=(nflow_for_process[i]))
p.daemon = True
processes.append(p)
p.start()
#here I join all the results again.
results_tmp = results[0]
for d in results[1:]:
for tuple in d:
if results_tmp.has_key(tuple):
results_tmp[tuple].update(d[tuple])
else:
results_tmp[tuple] = d[tuple]
return results_tmp
나는 사전이 문제를 해결할 생각 :
당신이 사전을 얻기 위해 사용할 수있는 것보다
. –사전 어디서? 아이들이 무엇을 반환해야하는지, 또는 목록에 추가해야하는 사전. 그러나 공유 메모리가 없기 때문에 효율적인 방법을 찾을 수 없습니다. 피클은 돌아 오는 사전을 피클 할 때 많은 시간을 필요로합니다. – edgarstack