2014-03-25 3 views
2

나는 다음과 같은 파이썬 코드가 : 나는 그것을 실행하면주 스레드가 무한 루프를 실행 중일 때 다른 스레드에서 모듈을 가져 오는 데 시간이 오래 걸리는 이유는 무엇입니까?

import threading 
from datetime import datetime 
import time 

def f(): 
    print('---- {:%H:%M:%S}'.format(datetime.now())) 
    import http.server 
    print('---- {:%H:%M:%S}'.format(datetime.now())) 

threading.Thread(target=f).start() 

while True: 
    pass 

, 나는 많은 시간이 import http.server에 소비되는 참조하십시오. 다음 출력에서 ​​볼 수 있듯이 가져 오기를 수행하는 데 23 초가 걸렸습니다. 나는 무한 while 루프에서 약간의 잠을 넣으면

C:\>python foo.py 
---- 10:12:03 
---- 10:12:26 

그러나, 수입은 빠르게 발생합니다.

import threading 
from datetime import datetime 
import time 

def f(): 
    print('---- {:%H:%M:%S}'.format(datetime.now())) 
    import http.server 
    print('---- {:%H:%M:%S}'.format(datetime.now())) 

threading.Thread(target=f).start() 

while True: 
    time.sleep(1) 

출력 :

C:\>python foo.py 
---- 10:15:58 
---- 10:15:58 

내가 join() 방법의 사용은 알고 있지만 무한 while 루프가 수면 문이없는 때 정확하게 알고 왜 import http.server에 너무 오래 걸립니까 싶어 그것.

+0

달리기를 거의하지 않는다고 가정하면, while while 루프는 너무 자주 그리고 자주 발생하므로이 방법으로 보면 각 스레드의 각 호출에 "지퍼 원칙적으로 모든 스레드는 다음 스레드가 자신의 스레드가되기 전에 하나의 CPU주기를 갖습니다. 따라서 코드가 많은 "큰"모듈을 가져 오려면 각 라인 사이에 하나의'while True'가 반복되어 프로세서에서 한 사이클을 소비하기 때문에 시간이 걸릴 것입니다. – Torxed

+0

@Torxed는 CPython 인터프리터가 실행중인 프로세서의 코어에서만 99,9 %의 CPU 사이클을 소모 할 것입니다. 다른 코어는 영향을받지 않습니다. – ElmoVanKielmo

+0

Python이 여러 개의 코어에서 실행되도록 개발되지 않았기 때문에 분명히 예. 이것은 내가 설명 할 필요가 없어야한다고 생각한 것입니다. 그래서 오래 전 제 설명의 해당 부분을 제거했습니다 :) – Torxed

답변

3

CPython은 해석기 컨텍스트를 보호하기 위해 전역 인터프리터 잠금을 사용합니다. 이렇게하면 스레드가 동시에 실행되지 않습니다. 사실 그들은 모두 단일 프로세서 코어에서 실행됩니다. CPython에서는 쓰레드가 유휴 (idle)와 같은 작업을 할 때 (즉, I.O를 기다릴 때) 스레드로부터 이익을 얻을 수 있습니다. 또는 소켓에서 듣기.
주 스레드에 대해 많은 작업을 수행했습니다. pass은 아무런 재미가 없지만 CPU 사이클을 소비하며 통역사는 CPU 시간을이 스레드에 제공하는 것이 중요하다고 생각합니다.
sleep으로하면 don't waste anything for this thread until time expires이라고 말합니다.

0

저는 주제에 대해 전문가가 아니지만 여러 스레드가 동일한 코어에서 차례로 실행된다는 것을 알고 있기 때문에 CPU 시간 공유에 대한 질문입니다. 그런 다음 무한 루프에 절전 모드를 추가하면 가져 오기 스레드에 더 많은 리소스가 제공됩니다. 병렬로 실행하려면 다중 처리를 사용하십시오. 그런 다음 코드에서 둘 이상의 코어를 사용합니다. 이 간단한 것을 확인할 수 있습니다. example

+0

또한 CPython 구현과 관련이 있다고 말해야합니다. – ElmoVanKielmo