2017년 1월 17일 화요일

Python Threading, Thread

Python Threading, Thread

하나의 프로세스 안에서 스레드를 생성하여 작업 하는 방법에 대해 알아보자.
from time import sleep

def longtime_job(a,b):
    print('++JOB START')
    sleep(5)
    print('++JOB RESULT [%d]' %(a*b))

def main():
    a, b = 3, 4
    longtime_job(a, b)
    print('**RUN MAIN LOGIC')
    ret = a+b
    print('MAIN RESULT [%d]' %ret)

if __name__ == '__main__':
    main()
다음 코드는 longtime_job 함수에서 5초 슬립하게 되면서 main함수는 실행되지 않는 매우! 비효율 적인코드이다.
5초 동안 그냥 sleep 하고 있게 된다…!
이때 전부터 궁금했던 쓰레드를 생성해서 해결하는 방법은 어떤 방법이 있을까?
우선 쓰레드 생성 방법은 다음과 같다.
t = threading.Thread(target=스레드가 실행할 함수, args(함수 인자))
t.start()
생각보다 매우 간단하군? 그럼 위에 코드를 수정해볼까. 우선 longtime_job이 슬립하고 있어도 메인을 돌려보자..그럼 대충 이런 코드를 넣으면 되겠지?
thread = Thread(target=longtime_job, args=(a, b))
t.start()
여기서 Thread 호출을 위해서 Thread 모듈을 추가해준다.
from threading import Thread
from time import sleep
from threading import Thread

def longtime_job(a,b):
    print('++JOB START')
    sleep(5)
    print('++JOB RESULT [%d]' %(a*b))

def main():
    a, b = 3, 4
    thread = Thread(target=longtime_job, args=(a, b))
    thread.start()
    #longtime_job(a, b)
    print('**RUN MAIN LOGIC')
    ret = a+b
    print('MAIN RESULT [%d]' %ret)

if __name__ == '__main__':
    main()

output>>

++JOB START
**RUN MAIN LOGIC
MAIN RESULT [7]
++JOB RESULT [12]
[Finished in 5.1s]
만약 스레드가 종료되길 원하면 t.join()을 사용하면 스레드 t가 종료할 때까지 기다리게 된다.

댓글 없음:

댓글 쓰기