2012-02-12 5 views
13

내 응용 프로그램에 파이썬 다중 처리 또는 셀러리 또는 pp를 사용하도록 결정하는 데 문제가 있습니다.Celery는 파이썬 다중 처리와 같이 로컬 시스템에서 효율적입니까?

내 응용 프로그램은 매우 무겁지 만 현재는 하나의 CPU 만 사용하므로 모든 사용 가능한 CPU (이는 파이썬의 다중 처리 라이브러리를 살펴 보았습니다)를 통해 배포해야하지만이 라이브러리는 다른 필요한 경우 기계. 현재 코드를 실행하는 데 하나 이상의 서버가 필요한지는 확실치 않지만 로컬에서 셀러리를 실행하고 확장하려면 코드를 리팩터링하는 대신 새 서버를 추가해야합니다 (사용하는 경우와 같이). 다중 처리).

내 질문 :이 논리가 맞습니까? 로컬로 샐러리를 사용하는 데있어 부정적인 영향 (성능)이 있습니다 (여러 코어가있는 단일 서버가 내 작업을 완료 할 수 있다고 밝혀지면)? 또는 멀티 프로세싱을 사용하고 나중에 다른 것으로 변환하는 것이 더 바람직합니까?

감사합니다.

p.s. 이것은 개인 학습 프로젝트를위한 것이지만 어쩌면 언젠가는 회사에서 개발자로 일하고 싶은데 전문가가 어떻게하는지 배우고 싶을 것입니다.

+0

여러 CPU가 IO 부담이 큰 appliction을 도울 것이라고 생각합니까? 응용 프로그램이 IO 바인딩 된 경우 CPU가 아닌 다중 IO 채널이 필요합니다. –

+0

반대 단어 죄송합니다 ... 아주 CPU를 많이 사용합니다. 기본적으로 많은 데이터 입력이있는 대규모 재귀의 수학에 불과합니다. – Lostsoul

+0

아 - 그 경우 계속 수행 :) 내결함성이 필요합니까? 예 : 모든 곳에 산재 해있는 자원 봉사 컴퓨팅을 사용하려고합니다. 아니면 랩이나 컴퓨터에서 컴퓨터를 사용하려고합니다. 클러스터? –

답변

4

저는 실제로 셀러리를 사용한 적이 없지만 다중 처리를 사용했습니다.

셀러리에는 다른 컴퓨터에서 작업자를 실행할 수있는 방법을 포함하여 메시지 (작업)를 전달하는 여러 가지 방법이있는 것 같습니다. 따라서 메시지 전달은 다중 처리보다 느려질 수 있지만 다른 한편으로는 다른 시스템으로 부하를 분산시킬 수 있다는 단점이 있습니다.

멀티 프로세싱은 한 대의 컴퓨터에서만 실행할 수 있습니다. 그러나 다른 한편으로는 프로세스 간의 통신은 공유 메모리를 사용하는 등 매우 빠를 수 있습니다. 또한 매우 많은 양의 데이터를 처리해야하는 경우 로컬 디스크에서 데이터를 읽고 쓸 수 있으며 프로세스간에 파일 이름을 전달하기 만하면됩니다.

Celery가 작업 실패를 얼마나 잘 처리 할 수 ​​있는지 잘 모르겠습니다. 예를 들어 작업이 실행을 끝내지 못하거나 충돌 할 수 있습니다. 일정한 시간 내에 작업이 끝나지 않으면 작업을 종료 할 수 있습니다. 그것이 없으면 지원을 추가하는 것이 얼마나 힘든지 모르겠다.

다중 처리는 기본적으로 내결함성이 제공되지 않지만 너무 많은 문제없이 직접 만들 수 있습니다.

+2

메시징 오버 헤드로 인해 Celery는 실제로 multiprocessing.Pool을 사용하는 것보다 더 많은 오버 헤드가 발생합니다. 셀러리는 어떤 형태로든 태스크 실패를 잘 처리합니다. 또한 제한 시간과 훨씬 더 많은 것을 지원합니다. Celery는 시간 제한을 지원하고 풀을 서비스 (즉, 영원히 계속 실행)와 관련된 많은 버그 및 종료와 관련된 버그를 수정하는 다중 처리 풀 (celery.concurrency.processes.pool.Pool)의 개선 된 버전을 사용합니다. 어떤 사람들은 Celery의 풀 버전을 사용합니다. – asksol

+0

링크 : http://docs.celeryproject.org/ko/latest/userguide/workers.html#time-limits http://docs.celeryproject.org/ko/latest/userguide/workers.html#revoking-tasks 풀 옵션 : http://docs.celeryproject.org/ko/latest/internals/reference/celery.concurrency.processes.pool.html#celery.concurrency.processes.pool.Pool http://docs.celeryproject.org/ en/latest/internals/reference/celery.concurrency.processes.pool.html # celery.concurrency.processes.pool.Pool.apply_async – asksol

+2

또한 멀티 프로세싱을 사용하여 여러 컴퓨터에서 작업을 배포 할 수도 있지만 그렇게하지 않는 것이 좋습니다. 생산 품질을 높이는 데는 상당한 노력이 필요하며 셀러리에는 이미 이러한 문제를 해결하는 커뮤니티가 있습니다. – asksol

17

셀 범위가 multiprocessing.Pool과 공유 배열에 오버 헤드로 추가되는 정도를 결정하기위한 테스트가 끝났습니다. 테스트는 (292, 353, 1652) uint16 배열에서 위 너 필터를 실행합니다. 두 버전 모두 동일한 청킹을 사용합니다 (대략 : 292,353 차원을 사용 가능한 CPU 수의 제곱근으로 나눕니다). 두 가지 셀러리 버전이 시도되었습니다. 하나의 솔루션은 pickled 데이터를 보내고 다른 솔루션은 모든 작업자의 기본 데이터 파일을 엽니 다.

결과 : 내 16 코어 i7 CPU에서 셀리는 약 15 초가 걸리는 공유 배열이 multiprocessing.Pool 인 약 16 초입니다. 이 차이는 놀랍게도 작습니다.

세분화를 늘리면 분명히 차이가 커집니다 (셀러리가 더 많은 메시지를 전달해야합니다). 셀러리는 15 초가 걸리고 multiprocessing.Pool은 12 초가 걸립니다.

셀러리 작업자는 이미 호스트에서 실행 중이지만 풀 작업자는 각 실행마다 갈아 치우는 것을 고려하십시오.나는 이니셜 라이저에서 공유 배열을 통과 이후 처음으로 풀 멀티 프로세싱 시작할 수 있는지 확실하지 않다 :

with closing(Pool(processes=mp.cpu_count(), initializer=poolinit_gen, initargs=(sourcearrays, resarrays))) as p: 

와 만 resarrays은 잠금에 의해 보호됩니다.

+1

필자는 풀 설정을 측정과 분리했지만 거의 차이가 없었습니다 (예상대로 포크가 싸다). 다른 데이터 세트 (276, 385, 3821)로 시도 : 절인 전송 38을 통한 샐러리, 다중 처리. 풀 27s. 솔직히 샐러리가 훨씬 편안해졌으며 처리 시간이 전송 시간보다 실제로 길 경우 다른 머신에 자연스럽게 처리를 위임 할 수 있습니다. 단일 시스템에서는 성능 차이가 큰 데이터 세트에 대해서만 눈에 띄게됩니다. –