Python
에서는 한 프로세스에서 여러 가지 병렬 처리를 위해 Thread
를 구현 할 수 있는 API
를 제공 합니다.
프로그램을 여러 개로 나누지 않으며 하는 Thread Programming
의 장점은 다음과 같습니다.
하지만, 단점 또한 존재합니다.
진짜 이렇게 된다니까요?
일단 가장 기본적인 threading.Thread
를 이용하는 방법 입니다. threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
객체의 생성자의 파라미터는 다음과 같습니다.
target
: Thread
의 run()
함수를 통해 돌리고 싶은 함수를 넣는다. function
을 인자로 받는다.args
: target
으로 넣은 함수의 args 파라미터 값을 iterable
한 객체로 넣으면 된다.kwargs
: target
으로 넣은 함수의 kwargs 파라미터 값을 dict
객체로 넣으면 된다.name
: Thread
객체의 이름을 정한다. 없으면 "Thread-N" 이라는 unique한 값으로 정해진다. (N은 숫자다.)group
: Thread
를 그룹화 하여 실행할 때 사용 한다.daemon
: Thread
를 Daemon Thread
로 만들고 싶을 때 사용 한다.또한, threading.Thread
객체의 내부 멤버함수 입니다.
run()
: Thread
에 등록 된 함수를 실행합니다.getName(), setName()
: 스레드 이름의 getter/setter 함수 입니다.is_alive()
: 스레드가 실행 중인지를 반환 합니다.isDaemon(), setDaemon()
: 데몬 스레드를 지정하는 getter/setter 함수 입니다.예시 코드 입니다.
import threading, time
var = 0
def func(second):
time.sleep(second)
print("This Thread Used", second, "Second")
t = threading.Thread(target=func, args=(1,))
t.start()
print("Program end")
Program end
This Thread Used 1 Second
만약 Thread
가 메인 프로세스가 종료 되면 같이 종료되는 Daemon Thread
라면 어떻게 될 까요?
import threading, time
var = 0
def func(second):
time.sleep(second)
print("This Thread Used", second, "Second")
t = threading.Thread(target=func, args=(1,), daemon=True)
t.start()
print("Program end")
Program end
이렇게 메인 프로세스가 종료 됨에 따라서, Daemon Thread
는 작동 하지 않게 됩니다.
Thread
정보는 해당 스레드에서 threading.current_thread()
를 통해 Thread
객체를 가져오거나, threading.enumerate()
를 통해 Thread
객체 list
를 가져 올 수 있습니다.
import threading, time
var = 0
def func():
time.sleep(0.3)
print("Current thread: ", threading.current_thread().getName())
for _ in range(10):
t = threading.Thread(target=func)
t.start()
print(threading.enumerate())
[<_MainThread(MainThread, started 139696403076928)>, <Thread(Thread-1, started 139696381187840)>, <Thread(Thread-2, started 139696372795136)>, <Thread(Thread-3, started 139696294328064)>, <Threa
d(Thread-4, started 139696285935360)>, <Thread(Thread-5, started 139696277542656)>, <Thread(Thread-6, started 139696269149952)>, <Thread(Thread-7, started 139696260757248)>, <Thread(Thread-8, st
arted 139696252364544)>, <Thread(Thread-9, started 139696243971840)>, <Thread(Thread-10, started 139695690348288)>]
Current thread: Thread-1
Current thread: Thread-2
Current thread: Thread-3
Current thread: Thread-4
Current thread: Thread-5
Current thread: Thread-7
Current thread: Thread-8
Current thread: Thread-6
Current thread: Thread-9
Current thread: Thread-10
훌륭한 프로그래머는 병렬 프로그래밍에 대해도 익숙해 져야 합니다. 생각해보면, 스레드는 가장 가까운 곳에도 있습니다. 서버 프로그래밍이나, GPU를 이용한 딥 러닝 학습 등 많은 곳에서 사용됩니다. 더 쉬운 설명을 원한다면, 해당 링크에서 영상을 시청 해 주세요.