티스토리 뷰

프로그램을 작성하다 보면 동시성이 필요하게 될때가 있다.


즉 여러가지 일을 동시에 진행해야 한다.


os 에서 프로세스마다 리소스를 할당해서 여러 프로세스가 동시에 실행되는데


하나의 프로세스에서 여러개의 스레드를 생성하여 동시에 작업을 수행할 수 있다.


동시성을 갖는 것이지 성능향상에서 기대를 하지 않는게 좋다.


파이썬에서 제공하는 멀티 프로세스와 다르다.


그리고 비동기 io 가 필요하다면 asyncio 모듈을 사용하는 것을 권장한다.



def execute_thread(*args, **kwargs):
print(f"child thread start: args={args} kwargs={kwargs}")
sleep_time = random.randint(1, 3)
time.sleep(sleep_time)
print(f"child thread finished")


if __name__ == '__main__':
thread = threading.Thread(target=execute_thread, args=(1,), kwargs={"name": "kim", "age": 10})
thread.start()
thread.join()
print("parents thread finished")


threading 모듈을 이용해서 구현해 보자


thread.Thread 함수를 통해 스레드 인스턴스를 생성할 수 있다.


target 은 스레드를 돌릴 함수


args, kwargs 를 각각 함수의 인자로 넘겨 줄 수 있다.


start() 를 통해서 스레드를 시작할 수 있다.


여기서 join() 을 살펴 보자


join() 은 부모 스레드 즉, 해당 스레드를 생성한 스레드를 진행하지 않고


자식 스레드 즉 새로 생성한 스레드의 종료를 기다려 준다는 의미이다.


join() 이 없다면 자식 스레드의 종료를 기다리지 않고


"parents thread end" 가 출력되고 


"child thread finished" 가 호출 될것이다.


하지만 join() 이 있다면


"child thread finished"


가 호출되고 자식 스레드가 종료되는 것을 기다리고


"parents thread finished"


가 호출된다.



스레드에서는 순서를 제어하는게 굉장히 중요하다.


순서의 제어를 놓치게 되면 큰 문제가 발생한다.


방사선 기계 소프트웨어에서 스레드 문제로 


사람이 3명이나 사망한 사례가 있다고 한다. 








댓글