지난 포스팅에서는 파이썬 표준 라이브러리 중 zipfile 과 tempfile 에 대해 알아보았습니다.
이번 포스팅에서는 threading 표준 라이브러리에 대해 공부해 보도록 하겠습니다.
파이썬 표준 라이브러리
threading
스레드 프로그래밍은 초보 수준의 프로그래머에게는 구현하기가 매우 어려운 기술 중 하나 입니다.
일단 눈으로만 살펴 보고 넘어 가는게 좋겠네요
컴퓨터에서 동작하고 있는 프로그램들을 프로세스(process) 라고 합니다.
일반적으로 1 개의 프로세스는 한 가지의 일을 할 수 있지만 스레드(Thread)를 사용하게 되면 한 프로세스 안에서 2 가지 또는 그 이상의 작업도 한 번에 수행을 할 수가 있게 됩니다.
# 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("끝났습니다.")
(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 함수를 동시에 실행할 수가 있습니다.
시간이 많이 단축이 되겠죠?
아래는 스레드를 이용한 코드입니다.
# 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("끝났습니다.")
(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 를 사용해서 만든 스레드 객체가 동시 작업을 가능하게 해주기 때문입니다.
그러나 ‘시작합니다.’ 와 ‘끝났습니다’가 먼저 출력이 된 후에 스레드의 결과가 출력이 되는 것을 확인 할 수 있습니다.
그리고 정상적인 종료도 아닙니다.
원래의 목적은 ‘시작합니다.’가 먼저 출력이 되고 중간에 스레드의 결과가 출력이 된 후 마지막에 ‘끝났습니다.’ 가 출력이 되는 것입니다.
그래서 아래와 같이 수정을 해보겠습니다.
# 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 함수는 해당하는 스레드가 종료될 때까지 기다리게 해줍니다.
따라서 위 코드처럼 수행을 하게 되면 원하던 결과를 얻을 수가 있습니다.
(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
끝났습니다.
- 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
