thread2
은 join
이 호출되는지 여부에 관계없이 계속 실행됩니다 (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
감사 :
다소 덜 신비 로그 출력을 생성한다. 그것은 네트워크 호출이며 곧 완료되거나 시간이 초과 될 것이라고 확신합니다. 쓰레드가 영원히 계속 될 위험은 없습니다. 스레드가 이미 부모가 종료 된 후에 스레드가 종료 될 때 예기치 않은 동작 만 걱정되었습니다. –