본문으로 바로가기

소개

 

둘 이상의 쓰레드가 절차적으로 동작하기 위한 쓰레드 이벤트에 대해 알아보겠습니다.

 

 

예제 1

 

set()wait() 에 대한 예제입니다.

import threading
import time

def before_work():
    evt.set()
    print('* before work, done')

def after_work():
    print('** after work, waiting')
    evt.wait()
    print('** after work, done')

if __name__ == '__main__':
    evt = threading.Event()
    t1 = threading.Thread(target=after_work)
    t2 = threading.Thread(target=before_work)
    t1.start()
    t2.start()
** after work, waiting
* before work, done
** after work, done

 

Event 객체를 생성합니다. (default flag=0)

evt = threading.Event()

 

wait() 함수는 flag 가 1로 설정되기 전까지 대기합니다.

def after_work():
    print('** after work, waiting')    
    evt.wait()
    print('** after work, done')

 

set() 함수는 flag 를 1로 설정합니다.

def before_work():
    evt.set()
    print('* before work, done')

 

 

flag 가 1로 설정되었을 때의 예제입니다.

바로 실행되는 것을 볼 수 있습니다.

import threading

def run():
    evt.wait()
    print('run')

if __name__ == '__main__':
    evt = threading.Event()
    evt.set()
    t1 = threading.Thread(target=run)
    t1.start()
run

 

 

예제 2

 

isSet() 에 대한 예제입니다.

from queue import Queue
import threading
import time

def before_work():
    time.sleep(1)
    evt.set()
    print('* before work, done')

def after_work():
    print('** after work, waiting')
    evt.wait()
    
    print('** after work, done')

def check_state():
    print('*** check state,', evt.isSet())
    evt.wait()

    print('*** check state,', evt.isSet())
    
if __name__ == '__main__':
    evt = threading.Event()
    after_thr = threading.Thread(target=after_work)
    before_thr = threading.Thread(target=before_work)
    state_thr = threading.Thread(target=check_state)

    after_thr.start()
    time.sleep(1)
    state_thr.start()
    
    before_thr.start()
** after work, waiting
*** check state, False
* before work, done
** after work, done
*** check state, True

 

isSet() 함수는 현재 플래그 상태를 반환합니다.

print('*** check state,', evt.isSet())

 

후행 쓰레드인 after_thr 가 먼저 실행되서 wait() 을 호출하여 대기합니다.

1초 뒤, 플래그 상태 체크를 위한 state_thr 가 실행되서 isSet() 을 호출하여 플래그 상태를 출력합니다.

그 뒤로 선행 쓰레드 before_thr 가 실행되면서 set() 를 호출하여 대기하던 쓰레드가 동작을 완료합니다.