78. 파이썬 threading 표준 라이브러리

  • 네이버 블로그 공유하기
  • 카카오톡 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기

지난 포스팅에서는 파이썬 표준 라이브러리 중 zipfile 과 tempfile 에 대해 알아보았습니다.
이번 포스팅에서는 threading 표준 라이브러리에 대해 공부해 보도록 하겠습니다.

Smartdev.kr Table of Contents

파이썬 표준 라이브러리

threading

스레드 프로그래밍은 초보 수준의 프로그래머에게는 구현하기가 매우 어려운 기술 중 하나 입니다.
일단 눈으로만 살펴 보고 넘어 가는게 좋겠네요

컴퓨터에서 동작하고 있는 프로그램들을 프로세스(process) 라고 합니다.
일반적으로 1 개의 프로세스는 한 가지의 일을 할 수 있지만 스레드(Thread)를 사용하게 되면 한 프로세스 안에서 2 가지 또는 그 이상의 작업도 한 번에 수행을 할 수가 있게 됩니다.

Python
#  time_test.py
import time

def long_job():    # 6초의 시간이 걸리는 함수
    for i in range(6):
        time.sleep(1)    # 1초간 대기
        print("Working:%s\n" % i)

print("시작합니다")

for i in range(6):    # long_job 을 6회 수행합니다.
    long_job()
    
print("끝났습니다.")

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python time_test.py
시작합니다
Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

끝났습니다.

위 코드에서 long_job 함수는 실행을 하게 되면 6초의 시간이 걸리는 함수입니다.
이 함수를 총 6번 반복해서 실행하는 프로그램입니다.
6초씩 6번을 반복해서 36초라는 시간이 걸리게 됩니다.
그러나 스레드를 이용하게 되면 6초의 시간이 걸리는 long_job 함수를 동시에 실행할 수가 있습니다.
시간이 많이 단축이 되겠죠?
아래는 스레드를 이용한 코드입니다.

Python
#  thread_test.py
import time
import threading # 스레드를 생성하기 위해서는 threading 모듈이 필요합니다.

def long_job():    # 6초의 시간이 걸리는 함수
    for i in range(6):
        time.sleep(1)    # 1초간 대기
        print("Working:%s\n" % i)

print("시작합니다")

threads = []
for i in range(6):    # long_job 을 6회 수행합니다.
    t = threading.Thread(target=long_job) # 스레드를 생성을 합니다.
    threads.append(t)

for t in threads:
    t.start() # 스레드를 실행 합니다.
    
print("끝났습니다.")

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python thread_test.py
시작합니다
끝났습니다.
Working:0

Working:0
Working:0


Working:0

Working:0

Working:0

Working:1

Working:1

Working:1

Working:1

Working:1

Working:1

Working:2
Working:2
Working:2
Working:2


Working:2


Working:2


Working:3

Working:3

Working:3

Working:3

Working:3
Working:3


Working:4
Working:4

Working:4

Working:4

Working:4

Working:4


Working:5

Working:5

Working:5

Working:5

Working:5

Working:5

위 코드 두 개를 모두 실행해 보시면 아시겠지만 36초 정도의 시간이 걸리던 작업이 6초 정도에 빨리 진행이 되는 것을 확인 할 수가 있습니다.
이것은 threading.Thread 를 사용해서 만든 스레드 객체가 동시 작업을 가능하게 해주기 때문입니다.

그러나 ‘시작합니다.’ 와 ‘끝났습니다’가 먼저 출력이 된 후에 스레드의 결과가 출력이 되는 것을 확인 할 수 있습니다.
그리고 정상적인 종료도 아닙니다.
원래의 목적은 ‘시작합니다.’가 먼저 출력이 되고 중간에 스레드의 결과가 출력이 된 후 마지막에 ‘끝났습니다.’ 가 출력이 되는 것입니다.
그래서 아래와 같이 수정을 해보겠습니다.

Python
#  thread_test.py
import time
import threading # 스레드를 생성하기 위해서는 threading 모듈이 필요합니다.

def long_job():    # 6초의 시간이 걸리는 함수
    for i in range(6):
        time.sleep(1)    # 1초간 대기
        print("Working:%s\n" % i)

print("시작합니다")

threads = []
for i in range(6):    # long_job 을 6회 수행합니다.
    t = threading.Thread(target=long_job) # 스레드를 생성을 합니다.
    threads.append(t)

for t in threads:
    t.start() # 스레드를 실행 합니다.
    
for t in threads:
    t.join() # join 으로 스레드가 끝날 때 까지 기다립니다.
    
print("끝났습니다.")

아래 결과 처럼 스레드의 join 함수는 해당하는 스레드가 종료될 때까지 기다리게 해줍니다.
따라서 위 코드처럼 수행을 하게 되면 원하던 결과를 얻을 수가 있습니다.

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python test.py
시작합니다
Working:0
Working:0

Working:0
Working:0


Working:0
Working:0



Working:1
Working:1


Working:1
Working:1

Working:1


Working:1

Working:2
Working:2
Working:2

Working:2


Working:2


Working:2

Working:3
Working:3

Working:3

Working:3

Working:3
Working:3



Working:4
Working:4
Working:4

Working:4

Working:4



Working:4

Working:5
Working:5

Working:5
Working:5
Working:5


Working:5



끝났습니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
78. 파이썬 threading 표준 라이브러리

Leave a Comment