IT/프로그래밍

[파이썬] threading 모듈 사용법 [패스트 캠퍼스 챌린지 48일]

뜻밖의 행복 2022. 3. 12. 21:15
반응형

 

안녕하세요? 뜻밖의 행운입니다.

패스트 캠퍼스 도전 48일차 

2일만 하면 끝나네요 길면 긴시간인데 여기까지 오다니 

매년 새해 이런저런 결심만 해오다가 ㅎ

진짜 하나는 끝내는게 있어서 좋네요 

 

 

오늘은 파이썬 threading 모듈 사용방법에 대해서 배웠습니다.

하지만 제대로 사용하기 위해서는 결국 동시성에 관한 내용은 따로 찾아서 공부를 해야 할 것 같네요

import threading

# 스레드에서 실행할 함수
def work():
    print("[sub] start")
    keyword = input("[sub] 검색어를 입력하세요 >>>")
    print(f"[sub] {keyword}로 검색을 시작합니다...")
    print("[sub] end")

# 메인스레드 실행되는 부분
print("[main] start")

worker = threading.Thread(target=work)
#worker.daemon = True
worker.start()

print("[main] 메인 스레드는 자기할일을 합니다..")
print("[main] end")

threading 모듈 역시 쉬운 파이썬 답게 그냥 import로 사용하면 됩니다.

스레드가 어떻게 동작하는지 파악하기 위해 

main, sub 를 각각 나눠서 지정합니다. 

 

worker = threading.Thread(target=work)

worker.start()

 

스레드 사용의 핵심이겠네요 보면 인스턴스를 만들어서 사용하죠?

threading 모듈의 Thread 매서드를 이용해서 할당하는 것이 보입니다.

target=함수명으로 스레드를 사용합니다.

그리고 만든 인스턴스 뒤에 .start() 로 실행 시키면

 

아래와 같은 결과가 나오면서 실행이 됩니다.

 

[main] start
[sub] start
[main] 메인 스레드는 자기할일을 합니다..
[main] end
[sub] 검색어를 입력하세요 >>>1
[sub] 1로 검색을 시작합니다...
[sub] end

 

다만 main 스레드가 먼저 종료되어 버렸는데

main이 종료 될 때 sub도 종료되게 하려면 주석 처리된 .daemon = true를 풀어서 사용하면 됩니다.

 

이번에는 멀티 스레드에 대해서 좀 보면

import threading
import time

# 주식 자동매매
# 매수, 매도

# 매수 스레드
def buyer():
    for i in range(5):
        print("[매수] 데이터 요청 중...")
        time.sleep(1)
        print("[매수] 데이터 분석 중...")
        time.sleep(1)
        print("[매수] 오!! 지금이 매수 타이밍인가!!...")
        time.sleep(1)
        print("[매수] 풀매수 가즈아!!...")
        time.sleep(1)

# 매도 스레드
def saler():
    for i in range(5): 
        print("[매도] 데이터 요청 중...")
        time.sleep(1)
        print("[매도] 데이터 분석 중...")
        time.sleep(1)
        print("[매도] 손절할까? 익절할까?...")
        time.sleep(1)
        print("[매도] 눈물을 머금고 손절합니다...")
        time.sleep(1)

# 메인 스레드
print("[메인] start")
buyer = threading.Thread(target=buyer)
saler = threading.Thread(target=saler)
buyer.start()
saler.start()

buyer.join() # 매수 스레드가 종료될때까지 메인 스레드가 기다림 
saler.join() # 매도 스레드가 종료될때까지 메인 스레드가 기다림 
print("[메인] 장이 종료되었습니다.")

위 프로그램을 돌려보면 아래와 같은 형식의 결과가 나옵니다.

 

[메인] start
[매수] 데이터 요청 중...
[매도] 데이터 요청 중...
[매수] 데이터 분석 중...
[매도] 데이터 분석 중...
[매도] 손절할까? 익절할까?...
[매수] 오!! 지금이 매수 타이밍인가!!...
[매도] 눈물을 머금고 손절합니다...
[매수] 풀매수 가즈아!!...
[매도] 데이터 요청 중...
[매수] 데이터 요청 중...
[매도] 데이터 분석 중...
[매수] 데이터 분석 중...
[매도] 손절할까? 익절할까?...
[매수] 오!! 지금이 매수 타이밍인가!!...
[매도] 눈물을 머금고 손절합니다...
[매수] 풀매수 가즈아!!...
[매수] 데이터 요청 중...
[매도] 데이터 요청 중...
[매수] 데이터 분석 중...
[매도] 데이터 분석 중...
[매수] 오!! 지금이 매수 타이밍인가!!...
[매도] 손절할까? 익절할까?...
[매수] 풀매수 가즈아!!...
[매도] 눈물을 머금고 손절합니다...
[매수] 데이터 요청 중...
[매도] 데이터 요청 중...
[매도] 데이터 분석 중...
[매수] 데이터 분석 중...
[매수] 오!! 지금이 매수 타이밍인가!!...
[매도] 손절할까? 익절할까?...
[매수] 풀매수 가즈아!!...
[매도] 눈물을 머금고 손절합니다...
[매도] 데이터 요청 중...
[매수] 데이터 요청 중...
[매도] 데이터 분석 중...
[매수] 데이터 분석 중...
[매도] 손절할까? 익절할까?...
[매수] 오!! 지금이 매수 타이밍인가!!...
[매도] 눈물을 머금고 손절합니다...
[매수] 풀매수 가즈아!!...
[메인] 장이 종료되었습니다.

 

스레드가 무조건 한 차례씩 바뀌어가면서 수행되는 것은 아닙니다.

실행 할때마다 순서는 다를 수 있습니다.

 

여기서 처음 실행했던것과 다른 것은

 

buyer.join() # 매수 스레드가 종료될때까지 메인 스레드가 기다림
saler.join() # 매도 스레드가 종료될때까지 메인 스레드가 기다림

네 join 매서드 입니다. 주석에도 써있듯이 사용된 스레드가 끝날때 까지

메인 스레드가 먼저 종료되지 않고 기다렸다가 종료 되게 하는 매서드 입니다.

 

 

반응형