Python 다 중 스 레 드 및 다 중 스 레 드 에서 join()의 사용 방법 예제

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()의 용법 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기