Updated:

1 minute read

개요

  • 공식 문서
  • 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 ~~~