Python 다 중 스 레 드 및 다 중 스 레 드 에서 join()의 사용 방법 예제
다음은 다 중 스 레 드 만 예 로 들 면:
먼저 몇 가지 개념 을 명 확 히 해 야 한다.
지식 포인트 1:
프로 세 스 가 시 작 된 후에 기본 값 으로 메 인 스 레 드 가 생 성 됩 니 다.스 레 드 는 프로그램 실행 흐름 의 최소 단위 이기 때문에 다 중 스 레 드 를 설정 할 때 메 인 스 레 드 는 여러 개의 키 스 레 드 를 생 성 합 니 다.python 에서 기본 값 으로(사실은 setDaemon(False))메 인 스 레 드 는 자신의 작업 을 수행 한 후에 종 료 됩 니 다.이때 하위 스 레 드 는 자신의 작업 을 계속 수행 합 니 다.자신의 임무 가 끝 날 때 까지
다음 예 1 을 보시오.
지식 포인트 2:
우리 가 setDaemon(True)방법 을 사용 하여 하위 스 레 드 를 수호 스 레 드 로 설정 할 때 메 인 스 레 드 가 실행 이 끝나 면 모든 스 레 드 가 실 행 됩 니 다.발생 할 수 있 는 상황 은 하위 스 레 드 의 작업 이 완전히 실행 되 지 않 고 중단 되 는 것 입 니 다.
다음 예 2 를 보시오.
지식 포인트 3:
이때 join 의 역할 이 두 드 러 졌 습 니 다.join 이 완성 한 작업 은 바로 스 레 드 동기 화 입 니 다.즉,주 스 레 드 작업 은 join 함 수 를 설정 하 는 곳 에서 차단 상태 에 들 어가 다른 하위 스 레 드 가 실 행 될 때 까지 기 다 렸 다가 주 스 레 드 가 종 료 될 때 까지 실 행 됩 니 다.
예 는 아래 세 가 지 를 보십시오.
지식 포인트 4:
join 에 timeout 인자 가 있 습 니 다:
4.567917.데 몬 스 레 드 를 설정 할 때 메 인 스 레 드 가 하위 스 레 드 에 대해 timeout 을 기다 리 는 시간 에 이 하위 스 레 드 를 죽 이 고 마지막 으로 프로그램 을 종료 한 다 는 뜻 입 니 다.그 러 니까 10 개의 스 레 드 가 있 으 면 모든 대기 시간 은 timeout 의 누적 과 이다.쉽게 말 하면 모든 하위 스 레 드 에 timeout 의 시간 을 주 고 그 에 게 집행 하 게 하 는 것 이다.시간 이 되면 임무 가 완성 되 든 안 되 든 직접 죽 이 는 것 이다4.567917.수호 스 레 드 를 설정 하지 않 았 을 때 메 인 스 레 드 는 timeout 의 누적 과 이런 시간 을 기다 릴 것 입 니 다.시간 이 되면 메 인 스 레 드 가 끝 납 니 다.그러나 하위 스 레 드 를 죽 이지 않 았 습 니 다.하위 스 레 드 는 계속 실 행 될 수 있 습 니 다.하위 스 레 드 가 모두 끝 날 때 까지 프로그램 이 종 료 됩 니 다1:Python 다 중 스 레 드 의 기본 상황
import threading
import time
def run():
time.sleep(2)
print(' : ', threading.current_thread().name)
time.sleep(2)
if __name__ == '__main__':
start_time = time.time()
print(' :', threading.current_thread().name)
thread_list = []
for i in range(5):
t = threading.Thread(target=run)
thread_list.append(t)
for t in thread_list:
t.start()
print(' !' , threading.current_thread().name)
print(' :', time.time()-start_time)
그 실행 결 과 는 다음 과 같다.관건:
4.567917.시간 계산 은 메 인 스 레 드 에 대한 시간 계산 이 고 메 인 스 레 드 가 끝나 면 시간 계산 이 끝나 고 메 인 스 레 드 를 인쇄 할 때 입 니 다4.567917.메 인 스 레 드 의 임 무 를 완성 한 후에 메 인 스 레 드 는 이에 따라 끝나 고 서브 스 레 드 는 자신의 임 무 를 계속 수행 하 며 모든 하위 스 레 드 의 임무 가 모두 끝 날 때 까지 프로그램 이 끝 납 니 다데 몬 스 레 드 설정
import threading
import time
def run():
time.sleep(2)
print(' : ', threading.current_thread().name)
time.sleep(2)
if __name__ == '__main__':
start_time = time.time()
print(' :', threading.current_thread().name)
thread_list = []
for i in range(5):
t = threading.Thread(target=run)
thread_list.append(t)
for t in thread_list:
t.setDaemon(True)
t.start()
print(' !' , threading.current_thread().name)
print(' :', time.time()-start_time)
메모:setDaemon()이 start()전에그 실행 결 과 는 다음 과 같다.
관건:
메 인 스 레 드 가 끝 난 후에 하위 스 레 드 가 실행 되 지 못 하고 전체 프로그램 이 종료 되 었 음 이 분명 하 다.
join 의 역할
import threading
import time
def run():
time.sleep(2)
print(' : ', threading.current_thread().name)
time.sleep(2)
if __name__ == '__main__':
start_time = time.time()
print(' :', threading.current_thread().name)
thread_list = []
for i in range(5):
t = threading.Thread(target=run)
thread_list.append(t)
for t in thread_list:
t.setDaemon(True)
t.start()
for t in thread_list:
t.join()
print(' !' , threading.current_thread().name)
print(' :', time.time()-start_time)
그 실행 결 과 는 다음 과 같다.관건:
메 인 스 레 드 는 모든 하위 스 레 드 가 끝 난 후에 야 메 인 스 레 드 자체 가 끝나 고 프로그램 이 종료 되 는 것 을 볼 수 있 습 니 다.
주 프로그램 이 예상 치 못 하 게 종료 되 는 경우
온라인 프로 세 스 A 에서 B.join()을 사용 하면 스 레 드 A 가 join()을 호출 하 는 곳 에서 막 혔 고 스 레 드 B 가 완 료 될 때 까지 기 다 려 야 계속 실행 할 수 있 습 니 다.
import threading
import time
def child_thread1():
for i in range(10):
time.sleep(1)
print('child_thread1_running...')
def child_thread2():
for i in range(5):
time.sleep(1)
print('child_thread2_running...')
def parent_thread():
print('parent_thread_running...')
thread1 = threading.Thread(target=child_thread1)
thread2 = threading.Thread(target=child_thread2)
thread1.setDaemon(True)
thread2.setDaemon(True)
thread1.start()
thread2.start()
thread2.join()
1/0
thread1.join()
print('parent_thread_exit...')
if __name__ == "__main__":
parent_thread()
출력:parent_thread_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
Traceback (most recent call last):
File "E:/test_thread.py", line 31, in
parent_thread()
File "E:/test_thread.py", line 25, in parent_thread
1/0
ZeroDivisionError: integer division or modulo by zero
주 스 레 드 는 thread 2.join()까지 실 행 될 때 막 히 고 thread 2 가 끝 난 후에 야 다음 문장 을 실행 합 니 다.
1/0 은 메 인 스 레 드 를 잘못 종료 시 키 고 thread 1 은 daemon=True 를 설정 하기 때문에 메 인 스 레 드 가 예상 치 못 하 게 종료 되면 thread 1 도 바로 끝 납 니 다.thread 1.join()이 주 스 레 드 에서 실행 되 지 않 았 습 니 다.
총결산
파 이 썬 다 중 스 레 드 와 다 중 스 레 드 에서 join()을 사용 하 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 다 중 스 레 드 join()의 용법 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.