새 개체 목록을 만들기 위해 여러 프로세스를 시작합니다. htop
은 1 ~ 4 개의 프로세스를 보여줍니다 (항상 3 개의 새 오브젝트를 생성합니다). 훨씬 아래로 둔화 Python3 : 다중 처리가 많은 RAM을 소비하고 속도가 느려짐
def foo(self):
with multiprocessing.Pool(processes=3, maxtasksperchild=10) as pool:
result = pool.map_async(self.new_obj, self.information)
self.new_objs = result.get()
pool.terminate()
gc.collect()
내가
foo()
여러 번, 그것은 전체 프로세스가 느리게 실행 호출 될 때마다 호출 프로그램도, 결국 완료되지 않습니다. 이 프로그램은 모든 RAM을 먹기 시작하지만 순차적 접근 방식은 중요한 RAM 사용량이 없습니다.
내가 프로그램을 죽일 때, 이것은 대부분 프로그램이 마지막으로 실행 한 기능이었습니다.
->File "threading.py", line 293, in wait
waiter.acquire()
편집 내 상황에 대한 몇 가지 정보를 제공합니다. 노드로 구성된 트리를 만듭니다. foo()
은 자식 노드를 만들기 위해 부모 노드에서 호출됩니다. 프로세스에 의해 반환 된 result
은 이러한 자식 노드입니다. 그것들은 부모 노드의리스트에 저장됩니다. 순차적 인 방식으로 생성하는 대신 그 자식 노드의 생성을 병렬 처리하고 싶습니다.
제 편집을 참조하십시오. 그래서 당신을 이해한다면, 나는 각 프로세스에서 객체 외부에 extern 메서드를 호출해야합니다. – Jonas
객체의 메소드 인 parallelize 함수'self.new_obj'는 각 부모 노드가 직렬화되어 각 호출에서 전송되도록 요구합니다. _function_'new_obj (...)'가 (단순, 고아, 'stateless') 새로운 노드를 반환하고 foo가 그것을 링크하는 것을 담당하도록 그 메소드를 추출 할 수 있다면 (참조 부모 <-> 자식을 추가하는 등. ..하지만 호출 프로세스 _에서),이 모든 문제는 사라질 가능성이 높습니다. 자식 프로세스는 minmal 상태 만 전송하면됩니다. – val