2012-02-01 8 views
2

시스템 자원 사용법을 모니터하고 풀의 작업자 수를 동적으로 늘리거나 줄입니다.파이썬 다중 처리에서 동적 작업자 풀 관리

즉, 48GB RAM을 갖춘 24 코어 노드를 가지고 있으며, 필자가 필터링해야하는 4GB 데이터 파일로 읽습니다. 이 시스템은 다른 사람들이 사용하기도하므로 사용 가능한 메모리는 시간에 따라 다릅니다. 4GB 입력 데이터가 모든 작업자에게 복제되므로 작업자가 읽기 전용으로 만 필요하기 때문에 작업자를 피하는 방법을 아직 찾지 못했습니다. 권장 사항은 dicts() 및 list()의 dict()입니다.) 나는 곧바로 추방 될 것이므로 24 명의 노동자를 산란시킬 수 없다는 것을 의미합니다. 그래서 제가하고 싶은 일은 6 명의 근로자를 안전한 수로 말한 다음 프로세스를 시작한 다음 메모리 사용을 관찰하고 풀에 추가 작업자를 생성하고 메모리 사용량이 많으면 근로자 수를 줄이는 것입니다. , 그러나 더 이상 그 일꾼들에게 새로운 일을 알려주지는 않음). 이렇게하면 RAM 사용을 유지하면서 노드를 최대한 활용할 수 있습니다. < 95 %.

이 코드가 효과적인 이유는 6-12 명의 병렬 근로자도 몇 시간 동안 전체 코드가 실행되기 때문에 어느 정도 시간 동안조차도 20-30 %의 직원을 늘리면 전체 실행 시간.

지금 당장 Pool.map() 및 Pool.apply_async() 메서드를 사용하여 풀에 작업을 보내 었으므로 한 방법이 다른 방법보다 효과적 일 때 직접 기본 설정이 없습니다.

미리 감사드립니다.

답변

3

은 멀티 모듈은 share a dict에 여러 프로세스에 대한 방법을 제공 :

manager = mp.Manager() 
d = manager.dict() 

아마도 공유 딕셔너리를 사용하여, 당신은 훨씬 적은 메모리를 사용 여전히 24 명 노동자를 생성하고 있었다. 한 명의 작업자가 dict에 액세스하거나 mutate하면 ​​다른 작업자도 dict에 액세스하거나 변형하려고 시도 할 경우 차단할 수 있지만 이것이 기본 병목 현상이 아닌 경우 24 명의 작업자를 사용할 수 있으면 실행 시간이 크게 단축 될 수 있습니다.

+0

실제로 관리자를 사용하면 메모리 노출이 제한되어 더 많은 프로세스를 실행할 수 있으므로 일시적으로 문제가 완화되었지만 풀 작업자 수를 동적으로 관리하는 방법을 알고있는 것이 좋습니다. –

관련 문제