2015-01-15 4 views
0

내 프로그램에서 데이터에 대한 네트워크 호출이 필요합니다. 나는 그것들을 평행하게 부르려하지만 그들 모두가 완료 할 필요는 없다.명시 적으로 조인 메서드를 호출하지 않으면 스레드는 어떻게됩니까?

무엇 내가 지금해야하는 것은이의 문제가 짧은 네트워크 호출이 성공하더라도, 나는

을 완료는 더 이상 네트워크 호출에 걸리는 시간을 기다릴 필요가있다

thread1 = makeNetworkCallThread()  
thread1.start() 

thread2 = makeLongerNetworkCallThread() 
thread2.start() 

thread1.join() 
foo = thread1.getData() 

thread2.join() 
if conditionOn(foo): 
    foo = thread2.getData() 

# continue with code 

입니다

if 문 안에서 thread2.join()을 움직이면 어떻게됩니까? 조인 메소드가 호출되지 않을 수도 있습니다. 부실 스레드 등으로 인해 문제가 발생합니까?

답변

0

thread2join이 호출되는지 여부에 관계없이 계속 실행됩니다 (GIL의 경고가 있지만 네트워크 호출이므로 문제가되지 않을 수 있음). 차이점은 주 컨텍스트가 스레드가 다른 작업을 수행하기 전에 종료되기를 기다리는 지 여부입니다. 더 긴 네트워크 호출을 완료하지 않고 처리를 계속할 수 있으면 아무런 문제가 없어야합니다.

모든 스레드가 완료 될 때까지 프로그램이 실제로 종료되지 않습니다 (인터프리터는 종료되지 않음). 이 긴 네트워크 호출의 대기 시간에 따라 프로그램의 나머지 부분 (대기하지 않는 경우)의 실행 시간에 따라 프로그램이 끝났지 만 네트워크 호출이 끝날 때까지 실제로 종료되지 않는 것처럼 보일 수 있습니다 쪽으로. 이 바보 예를 고려

# Python 2.7 
import threading 
import time 
import logging 

def wasteTime(sec): 
    logging.info('Thread to waste %d seconds started' % sec) 
    time.sleep(sec) 
    logging.info('Thread to waste %d seconds ended' % sec) 

if __name__ == '__main__': 
    logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO) 

    t1 = threading.Thread(target=wasteTime, args=(2,)) 
    t2 = threading.Thread(target=wasteTime, args=(10,)) 

    t1.start() 
    t2.start() 

    t1.join() 
    logging.info('Main context done') 

이러한 로깅 출력 :

$ time python test.py 
2015-01-15 09:32:12,239 Thread to waste 2 seconds started 
2015-01-15 09:32:12,239 Thread to waste 10 seconds started 
2015-01-15 09:32:14,240 Thread to waste 2 seconds ended 
2015-01-15 09:32:14,241 Main context done 
2015-01-15 09:32:22,240 Thread to waste 10 seconds ended 

real 0m10.026s 
user 0m0.015s 
sys  0m0.010s 

참고 메인 문맥 2 초 후에 (그것을 완성 thread1 걸린 시간)를 그 단부에 도달하지만, thread2이 완료 될 때까지 (실행 시작 후 10 초) 프로그램이 완전히 종료되지 않습니다. 이와 같은 상황에서 (특히 출력이 이와 같이 기록되는 경우), 내 생각에 어떤 점에서 명시 적으로 join을 호출하고 로그에서 프로그램이 수행하고있는 작업을 명시 적으로 식별하는 것이 더 바람직하다고 생각합니다 사용자/운영자가 매달아 놓은 것처럼 보입니다. 내 어리석은 예를 들어, 그 주요 맥락의 끝에 다음과 같은 라인을 추가과 같습니다

$ time python test.py 
2015-01-15 09:39:18,979 Thread to waste 2 seconds started 
2015-01-15 09:39:18,979 Thread to waste 10 seconds started 
2015-01-15 09:39:20,980 Thread to waste 2 seconds ended 
2015-01-15 09:39:20,980 Main context done 
2015-01-15 09:39:20,980 Waiting for thread 2 to complete 
2015-01-15 09:39:28,980 Thread to waste 10 seconds ended 

real 0m10.027s 
user 0m0.015s 
sys  0m0.010s 
+0

감사 :

logging.info('Waiting for thread 2 to complete') t2.join() 

다소 덜 신비 로그 출력을 생성한다. 그것은 네트워크 호출이며 곧 완료되거나 시간이 초과 될 것이라고 확신합니다. 쓰레드가 영원히 계속 될 위험은 없습니다. 스레드가 이미 부모가 종료 된 후에 스레드가 종료 될 때 예기치 않은 동작 만 걱정되었습니다. –

관련 문제