반응형

스레드란 ?

 

- 1개의 프로세스가 1개의 일을 하지만,

스레드를 이용하면 동시에 여러 일을 수행 가능하게 해줍니다.

 

- Light Weight Process라고도 합니다.

 

스레드의 특징 및 장점

# process와 달리 값은 process 내에서 자원을 메소드 / 함수 자원을 공유합니다.

# 멀티 스레드를 사용하면 멀티테스킹이 가능합니다.

# CPU의 유효시간을 최소화 시킬 수 있다.

# idle time을 최소화하면서 메소드 단위로 진행 할 경우 메모리 절약, 여러개 응용프로그램을 동시 조작 가능

 

스레드를 사용하기 위해선 다음과 같은 모듈을 호출합니다.

import threading

 

Ex 1) 스레드를 사용한 경우와 사용하지 않은 경우 차이점 알기

 

def run(id):
    for i in range(1,4):
        print('id : {} --> {}'.format(id, i))

# thread를 사용하지 않는 경우
# 순서대로 출력합니다. -> 일 3번찍고 둘 3번찍고
run('일')
run('둘')        
print()


# 출력 결과

id : 일 --> 1
id : 일 --> 2
id : 일 --> 3
id : 둘 --> 1
id : 둘 --> 2
id : 둘 --> 3

프로그램종료

우선, 스레드를 사용하지 않은 소스코드입니다.

 

for문이 1부터 3번을 반속 수행하는데 스레드를 사용 하지 않았기 때문에, 하나의 작업을 끝마친후 다음 작업을 진행하는 것을 알 수 있습니다.

 

이번에는 스레드를 사용한 경우

 

- 여기서 스레드를 사용할 경우 랜덤으로 실행되지만, 실행 순서를 정해줄 순 없다.

변수명 = threading.Thread(target=스레드 진행할 함수, args=(돌릴 인자))

변수명.start() : 스레드 시작시 사용

변수명.join() : 스레드가 종료되길 기다릴 경우

변수명.run() : 스레드의 동작을 정의

 

import threading

def run(id):
    for i in range(1,4):
        print('id : {} --> {}'.format(id, i))
        time.sleep(0.3) # 동시에 돌아가는것을 보여주기위해 작성

th1 = threading.Thread(target=run, args=('일'))
th2 = threading.Thread(target=run, args=('둘'))

th1.start()
th2.start()

th1.join()
th2.join()


# 출력 결과

id : 일 --> 1
id : 둘 --> 1
id : 일 --> 2
id : 둘 --> 2
id : 일 --> 3
id : 둘 --> 3
프로그램종료

 

th1 스레드 1번 th2 스레드 1번 이 과정을 반복하여 실행되는 결과를 볼 수 있습니다.

 

다음으로 join() 함수를 사용하지 않고, 출력한 경우의 출력 결과입니다.

# 출력 결과

id : 일 --> 1
id : 둘 --> 1
프로그램종료
id : 일 --> 2
id : 둘 --> 2
id : 둘 --> 3
id : 일 --> 3

 

차이점은 다음과 같습니다.

join 함수를 사용하지 않으면 스레드가 끝나길 기다리지 않고, print() 문의 '프로그램종료' 를 출력 후 다시 작동하는 것을 볼 수 있습니다.

반면 join() 함수를 사용한 경우 스레드 과정을 다 마친 후에 print() 문을 출력한 사실을 알 수 있습니다.

 

 

Ex 2) thread와 time 모듈을 이용하여 날짜 및 시간을 출력하기

import time

 

time 모듈의 localtime() 함수를 가지고 존재하는 속성값

tm_year

년도(4자리 작성)

tm_mon

월(1~12)

 

tm_mday

일(1~31)

tm_hour

시(0~23)

tm_min

분(0~59)

tm_sec

초(0~60)

tm_wday

각 요일을 숫자로 나타냅니다. (월요일= '0')

tm_yday

1월 1일부터 오늘까지 일 수 (1~365)

 

# 이 소스코드는 스레드를 사용하지 않았습니다.

now = time.localtime()

print('현재는{}년  {}월 {}일'.format(now.tm_year, now.tm_mon, now.tm_mday))
print('{}시 {}분  {}초'.format(now.tm_hour, now.tm_min, now.tm_sec))
print('오늘은  {} 요일 이고 올해  {} 번째 날'.format(now.tm_wday, now.tm_yday))


# 출력 결과

현재는2020년  5월 15일
17시 25분  53초
오늘은  4 요일 이고 올해  136 번째 날
프로그램  종료

 

thread를 사용하여 현재 진행중인 시간 1초마다 반복 출력

 

import time
import threading

def cal_show():
    now = time.localtime()
    print('현재 {} 년  {} 월 {} 일'.format(now.tm_year, now.tm_mon, now.tm_mday), end = ' ')
    print('{} 시  {} 분   {} 초'.format(now.tm_hour, now.tm_min, now.tm_sec))

def myRun():
    while True:
        now2 = time.localtime()
        if now2.tm_min == 34: break
        cal_show()
        time.sleep(1)
  
th = threading.Thread(target=myRun)
th.start()
th.join()

print('프로그램  종료')


# 출력 결과

현재 2020 년  5 월 15 일 17 시  28 분   6 초
현재 2020 년  5 월 15 일 17 시  28 분   7 초
현재 2020 년  5 월 15 일 17 시  28 분   8 초
현재 2020 년  5 월 15 일 17 시  28 분   9 초
현재 2020 년  5 월 15 일 17 시  28 분   10 초
현재 2020 년  5 월 15 일 17 시  28 분   11 초
현재 2020 년  5 월 15 일 17 시  28 분   12 초
현재 2020 년  5 월 15 일 17 시  28 분   13 초
현재 2020 년  5 월 15 일 17 시  28 분   14 초
현재 2020 년  5 월 15 일 17 시  28 분   15 초
현재 2020 년  5 월 15 일 17 시  28 분   16 초
현재 2020 년  5 월 15 일 17 시  28 분   17 초
현재 2020 년  5 월 15 일 17 시  28 분   18 초
현재 2020 년  5 월 15 일 17 시  28 분   19 초
현재 2020 년  5 월 15 일 17 시  28 분   20 초

 

 

반응형

+ Recent posts