Python: thread
개요
- 공식 문서
- daemon 플래그
- 데몬 스레드 여부 설정
- True일 경우 데몬 스레드만 남았을 때 프로그램 즉시 종료
- False일 경우 스레드가 종료될 때까지 대기
예제
-
코드
import threading
import time
class Thread(threading.Thread):
def __init__(self, lock, count, result):
threading.Thread.__init__(self)
self.lock = lock
self.count = count
self.result = result
def run(self):
self.lock.acquire()
print('threading.get_native_id() :', threading.get_native_id())
print('threading.current_thread().name :',
threading.current_thread().name)
print('threading.get_ident() :', threading.get_ident(), '\n')
for i in range(0, self.count):
self.result[0] += 1
self.lock.release()
class Test:
def __init__(self):
self.lock = threading.Lock()
self.count = 100000
self.result = 0
def worker_1(self, arg1, arg2):
print('arg1 :', arg1)
print('arg2 :', arg2)
with self.lock:
for i in range(0, self.count):
self.result += 1
def worker_2(self, second):
print('\t~~~', threading.current_thread().name, 'start ~~~')
time.sleep(second)
print('\t~~~', threading.current_thread().name, 'end ~~~')
def run_1(self):
threads = []
for i in range(0, 2):
t = threading.Thread(target=self.worker_1, args=(1, 2))
t.start()
threads.append(t)
for t in threads:
t.join()
print('self.result :', self.result)
def run_2(self):
t1 = threading.Thread(target=self.worker_2,
name='dameon=False',
args=(1, ))
t1.start()
t2 = threading.Thread(target=self.worker_2,
name='daemon=True',
args=(2, ),
daemon=True)
t2.start()
def worker(lock, count, result):
with lock:
for i in range(0, count):
result[0] += 1
def way_1():
print('----- way_1 start -----')
threads = []
lock = threading.Lock()
count = 100000
result = [0]
for i in range(0, 2):
t = Thread(lock, count, result)
t.start()
threads.append(t)
for t in threads:
t.join()
print('result :', result)
print('----- way_1 end -----\n')
def way_2():
print('----- way_2 start -----')
Test().run_1()
print('----- way_2 end -----\n')
def way_3():
print('----- way_3 start -----')
threads = []
lock = threading.Lock()
count = 100000
result = [0]
for i in range(0, 2):
t = threading.Thread(target=worker, args=(lock, count, result))
t.start()
threads.append(t)
for t in threads:
t.join()
print('result :', result)
print('----- way_3 end -----\n')
def way_4():
print('----- way_4 start -----')
Test().run_2()
print('----- way_4 end -----\n')
if __name__ == '__main__':
print('__main__ start\n')
way_1()
way_2()
way_3()
way_4()
print('__main__ end')
-
실행 결과
__main__ start
----- way_1 start -----
threading.get_native_id() : 1212671
threading.current_thread().name : Thread-1
threading.get_ident() : 140377215727168
threading.get_native_id() : 1212672
threading.current_thread().name : Thread-2
threading.get_ident() : 140377207334464
result : [200000]
----- way_1 end -----
----- way_2 start -----
arg1 : 1
arg2 : 2
arg1 : 1
arg2 : 2
self.result : 200000
----- way_2 end -----
----- way_3 start -----
result : [200000]
----- way_3 end -----
----- way_4 start -----
~~~ dameon=False start ~~~
~~~ daemon=True start ~~~
----- way_4 end -----
__main__ end
~~~ dameon=False end ~~~