상위 목록: 하위 목록: 작성 날짜: 읽는 데 12 분 소요

쓰레드(Thread)

쓰레드(Thread)는 프로세스에서 실행되는 흐름의 단위를 의미합니다.

일반적으로 프로그램은 하나의 쓰레드를 갖고서 알고리즘이 진행됩니다.

만약, 한 번에 두 가지 이상의 문제를 해결하기 위해선 두 개 이상의 쓰레드를 구동해야합니다.

이러한 실행 방식을 멀티쓰레드(Multi-Thread)라 부릅니다.



서브 쓰레드(Sub-Thread)

import threading


def first_task(data):
    for i in data:
        print("first_task :", i)


def second_task(data1, data2):
    for i, j in zip(data1, data2):
        print("second_task :", i, j)


task1 = threading.Thread(target=first_task, args=(range(5),))
task2 = threading.Thread(target=second_task, args=(range(5), range(5)))

print("START")
task1.start()
task2.start()
print("END")
결과
START
first_task : 0
first_task : 1
second_task : 0 0
first_task :ENDsecond_task : 2
first_task : 3
first_task :
4
1 1
second_task : 2 2
second_task : 3 3
second_task : 4 4

멀티 쓰레드를 구성하기 위해선 서브 쓰레드를 구성해야 합니다.

서브 쓰레드를 사용하면 기존의 직렬 구조에서 병렬 구조로 연산이 가능합니다.

쓰레드를 사용하기 위해선 threading 모듈을 포함시킵니다.

쓰레드threading 모듈의 Thread 클래스로 실행시킬 수 있습니다.

쓰레드 클래스는 threading.Thread(target=함수, args=(함수의 매개변수))입니다.

args튜플만 지원하며, 하나의 매개변수를 전달하는 경우, 쉼표(,)를 추가해 튜플로 설정합니다.

출력 결과에서 확인할 수 있듯이 print("END") 구문이 먼저 출력됩니다.

또한 first_task 함수와 second_task가 별도의 쓰레드에서 연산되는 것을 알 수 있습니다.



데몬 쓰레드

import threading


def first_task(data):
    for i in data:
        print("first_task :", i)


def second_task(data1, data2):
    for i, j in zip(data1, data2):
        print("second_task :", i, j)


task1 = threading.Thread(target=first_task, args=(range(5000),))
task2 = threading.Thread(target=second_task, args=(range(5), range(5)))

task1.daemon = True
task2.daemon = True

print("START")
task1.start()
task2.start()
print("END")
결과
START
first_task : 0
first_task : 1
first_task : 2
first_task : 3END
second_task : 0 0
first_task :second_task : 1 14
second_task : 2 2
second_task : 3 first_task :3 5
first_task :second_task : 6 4 4
first_task : 7
first_task : 8
first_task : 9
first_task : 10
first_task : 11
first_task : 12
first_task : 13

first_task : 752
first_task : 753
first_task : 754
first_task : 755
first_task :

데몬 쓰레드(Daemon-Thread)란 메인 쓰레드가 종료되면 같이 종료되는 쓰레드를 의미합니다.

서브 쓰레드는 메인 쓰레드가 종료되도 연산을 끝까지 진행합니다.

하지만, 데몬 쓰레드는 메인 쓰레드가 종료되면 연산을 중단합니다.

쓰레드의 daemon 멤버의 값을 True로 설정하면 데몬 쓰레드가 됩니다.

출력 결과에서 확인할 수 있듯이 first_task : 756를 출력하다 종료합니다.

print("END")구문을 출력됐지만, 조금 더 결과가 출력되는 이유는 print("END") 이후에 메인 쓰레드가 종료되는 시간까지 포함됩니다.

그러므로, END 출력 이후, 메인 쓰레드가 종료될 때 까지 연산을 진행합니다.

  • Tip : daemon의 기본값은 False입니다.

댓글 남기기