1 분 소요

개요

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