효율 및 코드 명확성 측면에서 말하면 스레드 또는 멀티 프로세싱을 사용할 때 결정해야 할 좋은 지침은 무엇입니까?파이썬 : 스레드 대 멀티 프로세싱 사용시기
답변
스레딩과 멀티 프로세싱의 차이점은 실제로 파이썬에만 국한된 것이 아니며 특정 차이점은 특정 파이썬 구현에만 해당됩니다.
CPython에, 나는에 하나 다음과 같은 경우 수 fo multiprocessing
모듈을 사용합니다 :
내가 성능상의 이유로 동시에 여러 코어의 사용을 확인해야합니다. 전역 인터프리터 잠금 (GIL)은 스레드를 사용할 때 속도가 향상되는 것을 방지합니다. 예를 들어, 주 작업이
ctypes
을 통해 호출 된 C 코드로 수행되거나 Cython을 사용할 때 GIL을 명시 적으로 릴리스 할 때 가끔씩 스레드를 제거 할 수 있습니다. 물론 후자는 특별한주의가 필요합니다. 이 경우는 실제로는 드뭅니다. 대부분의 응용 프로그램은 프로세서 시간에 제한받지 않으며, 실제로 사용하는 경우 일반적으로 Python을 사용하지 않습니다.내 응용 프로그램을 나중에 실제 분산 응용 프로그램으로 바꾸고 싶습니다. 다중 처리 응용 프로그램에서이 작업을 훨씬 쉽게 수행 할 수 있습니다.
수행 할 작업간에 공유 상태가 거의 필요하지 않습니다.
거의 모든 다른 환경에서 스레드를 사용합니다. (이것은 GUI 응용 프로그램이 반응하게 포함되어 있습니다.) 코드 선명도, 가장 큰 것 중 하나는 알고 배우고, 스레드 (또는 프로세스 사이에 이야기의 Queue 객체를 사랑하는 것입니다 들어
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 문제를 완전히 방지합니다.
대부분의 파이썬 코드에서 파이썬 3.x의 여러 스레드에서 속도를 높이 지 못합니다. 더 이상 느려지지 않을 것입니다. –
@Sven : "대부분의 코드"라고 말하는 것이 공평하지 않다고 생각합니다. 그것은 코드가 무엇인지 심각하게 의존합니다! 즉 : 코드가 파이썬 이외의 것들을 기다리는 데 얼마나 많은 시간을 들여야하는지, 다른 파이썬 스레드가 험담 할 수 있는지. 많은 I/O 작업, GUI 작업 또는 프로세서 무거운 C 확장 작업 (GIL을 릴리스 한 경우)을 사용하면 스레드가 큰 차이를 만들 수 있습니다. 대화 상대방에 따라 "대부분의 코드"에는 웹 서버가 포함되며,이 경우 [많은 이점을 제공하는 많은 맛이 있습니다] (http://nichol.as/benchmark-of-python-web-servers). – Russ
다른 스레드가 블로킹하는 동안 (GUI 코드에서와 같이) 스레드를 사용하여 병렬 번호를 처리하는 것으로부터 [speedup] (http://en.wikipedia.org/wiki/Speedup) (I 언급 한 이러한 유스 케이스 inmy 대답). 그리고 프로세서가 많은 C 확장의 속도를 높일 수는 있지만, 파이썬 코드라고 할 수는 없습니다. :) 솔직히 말하면, 내 의견은 명확하지 않습니다. –
- 1. 파이썬 : 멀티 코어 프로세싱?
- 2. 파이썬 멀티 프로세싱 서버 연결
- 3. Python : 멀티 프로세싱 설치
- 4. iPad 2 멀티 프로세싱?
- 5. 파이썬 멀티 프로세싱 db 액세스가 매우 느림
- 6. 파이썬 멀티 프로세싱 여러 입력을 가진 함수
- 7. 파이썬 멀티 프로세싱 우아하게 종료 하시겠습니까?
- 8. 멀티 스레드 대 Asp.net 3.5 싱글 스레드
- 9. 멀티 프로세싱 디버깅 오류
- 10. 프로세싱 대 (일반) Java
- 11. 이미지 프로세싱, 파이썬?
- 12. IEnumerable, IEnumerator 대 foreach, 사용시기
- 13. 파이썬 멀티 프로세싱 모듈을 사용하여 시작된 서브 프로세스 분리하기
- 14. Gevent Pywsgi Server - 멀티 프로세싱?
- 15. 멀티 프로세싱 작업자 풀 사용
- 16. 멀티 스레드 및 멀티 프로세스의 성능 차이
- 17. 이벤트 루프 대 멀티 스레드 차단 IO
- 18. Segfault가 멀티 스레드 파이썬 확장 C 언어로
- 19. 파이썬 멀티 매니저
- 20. 하드웨어 스레드 대 부드러운 스레드?
- 21. 멀티 스레드
- 22. wxPython + 멀티 프로세싱 : 컬러 문자열이 합법적인지 확인
- 23. 멀티 프로세싱 환경에서 오래된 레코드가 있습니다.
- 24. Python 멀티 프로세싱. 관리자와 네트워크 소켓 공유
- 25. C++ 용 CrossPlatform 멀티 프로세싱 및 멀티 스레딩 라이브러리
- 26. Python 코드를 멈추었을 때 멀티 프로세싱 모듈이 없습니다.
- 27. 무관 한 프로세스를 가진 파이썬 다중 프로세싱
- 28. 여러 스레드 대 단일 스레드
- 29. 스레드 풀 대 스레드 산란
- 30. 배경 스레드 대 UI 스레드
"대 이벤트 루프"를 잊었습니다. –
스레드를 사용할 때 전역 인터프리터 잠금으로 인한 부작용에 대해서는 좋은 대답이 필요합니다. –
@Mike DeSimone - 동의합니다! :) – Russ