본문 바로가기

Programming/Python Tutorials

[PYTHON 3] Tutorials 31. Threading - 파이썬의 쓰레딩


이번 시간에는 파이썬에서 사용하는 Threading(쓰레딩)에 대해 알아보겠습니다. 프로그램을 코딩을 하고 컴파일을 할 때에는 Top to Bottom, Left to Right. 즉, 위에서 왼쪽에서 순서대로 컴파일을 하게 되어 있다. 한번에 하나씩 컴파일을 한다는 말이된다. 그런데 어떤 프로그램들은 굳이 이렇게 하나씩 컴파일을 할 필요가 없는 프로그램도 있다. 하나의 프로그램이 컴파일링이 끝날때 까지 기다리지 않고 다른 코드의 컴파일에 들어가도 전혀 문제가 되지 않을 경우에 Thread를 사용하여 마치 처음부터 다른 프로그램을 동시에 구동하는 것 마냥 컴파일을 할 수 있다. 말보다는 예제가 정답이다.

우선 thread를 사용하기 위해 python 에서 threading 모듈을 불러옵니다. ▼

메신저를 만드는 코딩을 한다고 가정을 한다면, 송신하는데 관여하는 코드와 수신하는데 관여하는 코드는 어느 하나가 끝날때까지 기다릴 필요가 없이 별개로 작동해도 된다. 이를 가정하여 Messenger 클래스를 정의하였습니다. 그리고 내장 모듈인 thread를 상속받게 하였습니다. ▼

파이썬에서 Thread의 특이점 중 하나는, Thread를 구동하기 위해서는 함수명을 'run' 으로 해주어야 한다는 점입니다. 이는 약속이므로 그냥 이렇게 사용하면 됩니다. ▼

10번을 반복하게 하는 반복문을 사용하였습니다. 과거에 다룬 반복문에서는 for 뒤에 임의의 변수를 사용해서 이 변수가 for문 안에서 다시 사용되는 형태였습니다. 그런데 여기에는 '_' (언더바) 로만 넣어놓았습니다. 변수를 지정하지 않고 단순하게 반복만 구현하고 싶을 때에는 아래와 같이 언더바로만 넣어 사용하면 됩니다. ▼

현재 어떤 구동되고 있는 Thread의 이름을 출력하는 프린트를 사용하였습니다. 서로 다른 Thread가 이 반복문을 참조할텐데, 그 때 어떤 Thread가 돌고 있는지 확인하기 위한 표기입니다. 결과를 보면 쉽게 이해가 될 것입니다. ▼

메시지를 보내는 객체 send 를 생성하였습니다. 그리고 thread의 name을 'Sending out messages'로 지정해 주었습니다. ▼

이번에는 받는 객체 receive를 생성하였습니다. 마찬가지로 thread의 name을 'Receiving messages'로 지정해 주었습니다. ▼

앞 시간에서 객체를 생성하고 객체의 구동은 클래스에 포함된 함수로 작동을 했었는데, 여기에서는 send.run() 또는 receive.run() 으로 입력을 하지 않고 있습니다. 이것 또한 thread의 특이사항중 하나입니다. 위에서 언급하였듯이, thread 는 함수명을 run()으로 지정을 합니다. 그리고 객체.start() 를 실행하면 클래스에서 run() 으로 된 부분을 찾게 되어 run()안의 코드를 실행하게 됩니다. 이 부분만 조심하시면 될 듯 합니다. ▼

여러번 실행을 해 보았는데, 엇갈려서 나오는 화면을 포착하면 좋았겠지만, 이 정도가 최선인 듯 합니다. send 객체가 미처 끝나기 전에 receive 객체가 실행이 되고, 다시 send 객체가 실행되고 , 다시 receive 객체가 실행되고 있는 결과창입니다. ▼

위 결과창에서 알 수 있듯이, 어느 한 코드가 10번 반복이 마무리 되기 전에 다른 코드가 실행이 되고 있는 것입니다. 이것이 thread 라고 이해하시면 될 것입니다. 과거에 비해 CPU 연산 처리 속도가 비약적으로 발전하여 하나씩 왔다갔다 하지 않고 하나를 여러번 실행한 찰나의 순간이 지나고 다른 하나의 thread를 실행하기에 위와 같은 결과가 나오고 있습니다. 

그리고 여기서 다루지는 않겠지만, Thread를 공부하였다면 추후에 multithreading 와 multiprocessing 도 공부를 하여야 할 것입니다. 전반적인 개념은 유사하나 상이한 점이 존재하므로 중,고급 파이썬을 공부하실 분들은 꼭 숙지하시기 바랍니다. 수고하셨습니다.