2016-07-23 5 views
0

GIL을 고려할 때이 프로그램은 9 초 안에 완료 될 것으로 예상했지만 놀랍게도 4 초 만에 끝납니다. 그럴 가능성이있는 이유를 찾거나 무엇인가 놓치고 있습니까? 실행멀티 스레드 파이썬 프로그램의 실행 시간

import time 
import threading 

def get_data(start, end): 
    res = [] 
    for i in range(start, end): 
     time.sleep(1) 
     res.append(i) 
    print res 


range_list = [(1,4), (4,7), (6,10)] 
for r in range_list: 
    t = threading.Thread(target=get_data, args = (r[0], r[1])) 
    t.start() 

시간 : - 스레딩과 함께 9 초

- -

스레딩없이 4 초

+1

3 개의 스레드를 생성하고 공유 자원을 사용하는 스레드가 없기 때문에 모든 스레드가 동시에 대기 * *하므로 4 초가 정확합니다. – Ibrahim

+1

'sleep '은 GIL을 해제합니다. http://stackoverflow.com/questions/1205328/scheduling-issues-in-python – cdarke

+0

ok, thanks @cdarke를 참조하십시오. 이것은 도움이됩니다. –

답변

1

일반적으로, 구초 때문에이 프로그램 마무리 멀티 스레딩 사용하지 않는 경우 파이썬 당신이 time.sleep (1)을 넣었을 때, 파이썬은 단지 1 초를 기다린다. 그리고 다른 한편으로는 아무것도하지 않는다. 그러나 멀티 스레딩을 사용할 때 프로그램은 스레드 기능을 개별적으로 실행합니다. 예를 들어 스레드 함수를 두 번 호출하면 스레드 함수가 한 번에 한 줄씩 다른 시간에 실행됩니다.

이 프로그램에서는 스레드 함수를 세 번 호출합니다. 첫 번째 호출, 파이썬은 i = 1, i = 2, i = 3, 두 번째 호출은 3 초, 파이썬은 i = 4, i = 5, i = 6, 파이썬 호출은 i = 6 , i = 7, i = 8, i = 9. 이 코드는 서로 독립적으로 실행되기 때문에이 프로그램은 4 초 만에 끝납니다. 가장 큰 시간은 4 초이기 때문입니다.

+0

응답 해 주셔서 감사합니다.하지만 여기에 잘못되었습니다. 파이썬 스레딩은 다른 언어와 같은 방식으로 작동하지 않습니다. GIL은 스레드가 이런 식으로 실행되도록하지 않습니다. 그것은 시간이다. 그것을 건너 뛰는 방법. 모든 시간에서 .sleep이 실행에 1 초가 걸리는 무거운 계산 (CPU 집약적)으로 바뀌면 멀티 스레딩을 사용하더라도 실행 시간이 줄어들지 않습니다. –

관련 문제