단일 코어에서 모두 실행되는 Python 스레드
많은 스레드를 생성하고 한 번에 4개를 실행하고 각각 값 비싼 작업을 수행하는 Python 프로그램이 있습니다. 의사 코드:
for object in list:
t = Thread(target=process, args=(object))
# if fewer than 4 threads are currently running, t.start(). Otherwise, add t to queue
그러나 프로그램이 실행될 때 OS X의 Activity Monitor는 4개의 논리적 코어 중 1개가 100%에 있고 나머지는 거의 0에 있음을 보여줍니다. 분명히 OS에 아무 것도 하도록 강제할 수는 없지만 그렇게 할 필요는 없었습니다. 이전에 이와 같은 다중 스레드 코드의 성능에주의를 기울이십시오. 그래서 내가 뭔가를 놓치거나 오해하고 있는지 궁금합니다.
감사 해요.
많은 경우(그리고 "비싼 작업"이 Python에서 구현된 계산인 거의 모든 경우), Python의 GIL(Global Interpreter Lock) 때문에 실제로 여러 스레드가 동시에 실행되지 않습니다 .
GIL은 인터프리터 수준 잠금입니다. 이 잠금은 Python 인터프리터에서 한 번에 여러 스레드의 실행을 방지합니다. 실행하려는 각 스레드는 다른 스레드에서 GIL이 해제될 때까지 기다려야 합니다. 즉, 다중 스레드 Python 응용 프로그램은 기본적으로 단일 스레드입니다. 그렇죠? 예. 정확히. 일종의.
CPython은 내부적으로 "운영 체제" 스레드를 사용합니다. 즉, 새 스레드를 만들기 위한 요청이 만들어질 때마다 인터프리터는 실제로 새 스레드를 생성하기 위해 운영 체제의 라이브러리와 커널을 호출합니다. 이것은 예를 들어 Java와 동일합니다. 따라서 메모리에는 실제로 여러 스레드가 있고 일반적으로 운영 체제는 실행되도록 예약된 스레드를 제어합니다. 다중 프로세서 시스템에서 이는 여러 프로세서에 많은 스레드가 분산되어 행복하게 작업을 수행할 수 있음을 의미합니다.
그러나 CPython은 운영 체제 스레드를 사용하지만(이론적으로는 여러 스레드가 인터프리터 내에서 동시에 실행될 수 있음) 인터프리터는 인터프리터와 스택에 액세스하고 메모리의 Python 개체를 수정할 수 있기 전에 스레드가 GIL을 강제로 획득하도록 합니다. 모두 기꺼이. 후자의 요점은 GIL이 존재하는 이유입니다. GIL은 여러 스레드가 Python 객체에 동시에 액세스하는 것을 방지합니다. 그러나 이것은 당신이 잠금에 민감한 생물이 되는 것을 방지하지 못합니다. 당신은 무임 승차를 얻지 않는다. GIL은 당신의 정신이 아닌 인터프리터의 기억을 보호하기 위해 존재합니다.
자세한 내용은 Jesse Noller 게시물 의 Global Interpreter Lock 섹션 을 참조하십시오.
이 문제를 해결하려면 Python의 다중 처리 모듈 을 확인하십시오 .
다중 프로세스(IPC를 신중하게 사용)는[...] 스레드보다 다중 CPU 상자용 앱을 작성하는 데 훨씬 더 나은 접근 방식입니다.
Python에는 해석된 코드의 스레드가 동시에 처리되는 것을 방지할 수 있는 전역 해석기 잠금이 있습니다.
http://en.wikipedia.org/wiki/Global_Interpreter_Lock
http://wiki.python.org/moin/GlobalInterpreterLock
이 문제를 해결하는 방법은 다음과 같이 multiprocessing 모듈 을 사용하십시오.
별도의 Python 프로세스를 실행하면 GIL이 방지됩니까?
AFAIK, CPython에서 Global Interpreter Lock은 한 번에 둘 이상의 Python 코드 블록이 실행될 수 없음을 의미합니다. 이것이 단일 프로세서/단일 코어 시스템에서는 아무 것도 영향을 미치지 않지만 다중 코어 시스템에서는 한 번에 하나의 스레드만 효과적으로 실행되어 다른 모든 코어가 유휴 상태가 됨을 의미합니다.
ReferenceURL : https://stackoverflow.com/questions/4496680/python-threads-all-executing-on-a-single-core
'IT이야기' 카테고리의 다른 글
Java에 대한 단위 테스트의 자동 생성 (0) | 2021.10.04 |
---|---|
word-wrap:break-word가 IE8에서 작동하지 않음 (0) | 2021.10.03 |
Enumerable.ElementAt() 대 [] 연산자를 사용하는 이유 (0) | 2021.10.03 |
OpenGL ES 2.0 셰이더를 사용하여 이러한 이미지 처리 작업을 수행 (0) | 2021.10.03 |
데이터베이스를 mysql에서 mongoDb로 변환 (0) | 2021.10.03 |