2011-01-17 7 views
29

효율 및 코드 명확성 측면에서 말하면 스레드 또는 멀티 프로세싱을 사용할 때 결정해야 할 좋은 지침은 무엇입니까?파이썬 : 스레드 대 멀티 프로세싱 사용시기

+5

"대 이벤트 루프"를 잊었습니다. –

+2

스레드를 사용할 때 전역 인터프리터 잠금으로 인한 부작용에 대해서는 좋은 대답이 필요합니다. –

+0

@Mike DeSimone - 동의합니다! :) – Russ

답변

16

스레딩과 멀티 프로세싱의 차이점은 실제로 파이썬에만 국한된 것이 아니며 특정 차이점은 특정 파이썬 구현에만 해당됩니다.

CPython에, 나는에 하나 다음과 같은 경우 수 fo multiprocessing 모듈을 사용합니다 :

  • 내가 성능상의 이유로 동시에 여러 코어의 사용을 확인해야합니다. 전역 인터프리터 잠금 (GIL)은 스레드를 사용할 때 속도가 향상되는 것을 방지합니다. 예를 들어, 주 작업이 ctypes을 통해 호출 된 C 코드로 수행되거나 Cython을 사용할 때 GIL을 명시 적으로 릴리스 할 때 가끔씩 스레드를 제거 할 수 있습니다. 물론 후자는 특별한주의가 필요합니다. 이 경우는 실제로는 드뭅니다. 대부분의 응용 프로그램은 프로세서 시간에 제한받지 않으며, 실제로 사용하는 경우 일반적으로 Python을 사용하지 않습니다.

  • 내 응용 프로그램을 나중에 실제 분산 응용 프로그램으로 바꾸고 싶습니다. 다중 처리 응용 프로그램에서이 작업을 훨씬 쉽게 수행 할 수 있습니다.

  • 수행 할 작업간에 공유 상태가 거의 필요하지 않습니다.

거의 모든 다른 환경에서 스레드를 사용합니다. (이것은 GUI 응용 프로그램이 반응하게 포함되어 있습니다.) 코드 선명도, 가장 큰 것 중 하나는 알고 배우고, 스레드 (또는 프로세스 사이에 이야기의 Queue 객체를 사랑하는 것입니다 들어

6

multiprocessing를 사용하는 경우는 ... 멀티가있다 its own Queue object). 대기열을 사용하면 작업이 훨씬 쉬워지고 훨씬 깨끗한 코드를 사용할 수 있다고 생각합니다.

은 좀 괜찮은 큐 예제 a look가 있고,이 사람은 훌륭한을 사용하는 방법의 예와 얼마나 유용한 그들이 (멀티 프로세싱 대기열을 신청 동일한 논리)되어 있습니다 http://effbot.org/librarybook/queue.htm

의 경우를 효율성, 세부 사항 및 결과는 대부분의 사람들에게 큰 영향을 미치지 않을 수도 있지만, 파이썬 < = 3.1에 대한 CPython 구현은 멀티 코어 컴퓨터에서 흥미로운 (잠재적으로 잔인한) 효율성 문제가 있습니다. 이 문제에는 the GIL이 포함됩니다. David Beazley는 a video presentation을 잠시 후 다시 보았습니다. 확실히 볼 가치가있는입니다. 더 많은 정보 here, 파이썬 3.2에서이 전면에 대한 중요한 개선에 대해 이야기하는 후속 조치를 포함합니다.

기본적으로 GIL 관련 멀티 코어 문제에 대한 요약은 다중 스레드를 사용하여 CPython < = 2.7에서 전체 멀티 프로세서 사용을 예상하는 경우 성능이 좋지 않을 경우 놀랄 필요가 없습니다 또는 심지어 단일 코어보다 나쁘다. 하지만 스레드가 많은 I/O (파일 읽기/쓰기, DB 액세스, 소켓 읽기/쓰기 등)를하고 있다면 문제를 알지 못할 수도 있습니다.

멀티 프로세싱 모듈은 프로세서 당 파이썬 인터프리터 (및 GIL)를 생성하여이 GIL 문제를 완전히 방지합니다.

+1

대부분의 파이썬 코드에서 파이썬 3.x의 여러 스레드에서 속도를 높이 지 못합니다. 더 이상 느려지지 않을 것입니다. –

+0

@Sven : "대부분의 코드"라고 말하는 것이 공평하지 않다고 생각합니다. 그것은 코드가 무엇인지 심각하게 의존합니다! 즉 : 코드가 파이썬 이외의 것들을 기다리는 데 얼마나 많은 시간을 들여야하는지, 다른 파이썬 스레드가 험담 할 수 있는지. 많은 I/O 작업, GUI 작업 또는 프로세서 무거운 C 확장 작업 (GIL을 릴리스 한 경우)을 사용하면 스레드가 큰 차이를 만들 수 있습니다. 대화 상대방에 따라 "대부분의 코드"에는 웹 서버가 포함되며,이 경우 [많은 이점을 제공하는 많은 맛이 있습니다] (http://nichol.as/benchmark-of-python-web-servers). – Russ

+0

다른 스레드가 블로킹하는 동안 (GUI 코드에서와 같이) 스레드를 사용하여 병렬 번호를 처리하는 것으로부터 [speedup] (http://en.wikipedia.org/wiki/Speedup) (I 언급 한 이러한 유스 케이스 inmy 대답). 그리고 프로세서가 많은 C 확장의 속도를 높일 수는 있지만, 파이썬 코드라고 할 수는 없습니다. :) 솔직히 말하면, 내 의견은 명확하지 않습니다. –

관련 문제