스레드와 프로세스
스레드와 프로세스
- 프로그램: 작업을 수행하는 명령어 집합
- 프로세스: 현재 실행중인 프로그램 (메모리상에 얹혀 있는 살아있는 프로그램)
- 스레드: 프로세스에서 실행되는 작업
프로세스는 기본적으로 하나의 스레드로 구성되지만 경우에 따라 여러 개의 스레드로 구성이 가능하다. (멀티스레딩)
동시성 (멀티스레딩)
동시성 프로그래밍은 실제로 여러개의 스레드가 동시에 진행되는 것은 아니지만 아주 빠른 속도로 번갈아가면서 여러개의 스레드를 번갈아 가면서 실행하여 동시에 진행되는 것 처럼 보이는 것을 말한다.
하나의 프로세스에서는 하나의 스레드만 동작할 수 있다. 이를 multithread로 만들어서 빠르게 변경하는 방식을 이용하면 마치 동시에 일어나는 것 처럼 보이게 된다는 것이다.
import threading
# 스레드에서 실행할 함수
def work():
print('[sub] start')
keyword = input('[sub] 검색어를 입력하세요.')
print(f'[sub] {keyword}로 검색을 시작')
print('[sub] end')
# 메인스레드에서 실행되는 부분
print('[main] start')
# Thread class의 타겟인자로 스레드에서 실행할 함수를 입력
worker = threading.Thread(target=work)
worker.start()
print('[main] end')
print('[main] 이제 메인 스레드는 자기 할일을 계속합니다.')
[main] start
[sub] start
[main] end
[main] 이제 메인 스레드는 자기 할일을 계속합니다.
[sub] 검색어를 입력하세요. >>> 안녕
[sub] 안녕로 검색을 시작
[sub] end
import threading
# 스레드에서 실행할 함수
def work():
print('[sub] start')
keyword = input('[sub] 검색어를 입력하세요.')
print(f'[sub] {keyword}로 검색을 시작')
print('[sub] end')
# 메인스레드에서 실행되는 부분
print('[main] start')
# Thread class의 타겟인자로 스레드에서 실행할 함수를 입력
worker = threading.Thread(target=work)
worker.daemon = True # 메인스레드가 종료될때 서브스레드가 같이 종료됨
worker.start()
print('[main] end')
print('[main] 이제 메인 스레드는 자기 할일을 계속합니다.')
[main] start
[sub] start
[main] end
[main] 이제 메인 스레드는 자기 할일을 계속합니다.
[sub] 검색어를 입력하세요. >>>
이번에는 sub 스레드를 두 개 만들어 본다.
import threading
import time
# 매수 스레드
def buyer():
for i in range(5):
print('[매수] 데이터 요청 중...')
time.sleep(1) # 1초 동안 프로세스 중지
print('[매수] 데이터 분석 중...')
time.sleep(1)
print('[매수] 매수 타이밍 계산 중...')
time.sleep(1)
print('[매수] 풀매수...')
time.sleep(1)
# 매도 스레드
def seller():
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)
seller = threading.Thread(target=seller)
buyer.start()
seller.start()
buyer.join() # 매수 스레드가 종료될 때까지 메인 스레드가 기다림
seller.join() # 매도 스레드가 종료될 때까지 메인 스레드가 기다림
print('[메인] 장 종료')
병렬성 (멀티프로세싱)
병렬성 프로그래밍은 프로세스 자체를 여러 개 두고 동시에 실행하는 것이다. 이 방법은 실제적으로 동시에 여러개의 스레드가 진행된다. 각 프로세스는 자기만의 작업을 수행한다.
멀티프로세싱이 멀티스레딩보다 자원을 더 많이 사용한다.
import multiprocessing as mp
# 프로세스에서 실행할 함수
def sub_process(name):
print("[sub] start")
print(name)
cp = mp.current_process()
print(f"[sub] pid : {cp.pid}")
print("[sub] end")
# 메인 프로세스
if __name__ == "__main__":
print("[main] start")
p = mp.Process(target=sub_process, args=('startcoding',))
p.start()
cp = mp.current_process()
print(f"[main] pid : {cp.pid}")
print("[main] end")
from multiprocessing import Process
import time
class Subprocess(Process):
def __init__(self, name):
Process.__init__(self)
self.name = name
def run(self):
print(f"[sub] {self.name} start")
time.sleep(5)
print(f"[sub] {self.name} end")
if __name__ == "__main__":
print("[main] start")
p = Subprocess(name='startcoding')
p.start()
p.join()
print("[main] end")
from multiprocessing import Process
import time
class Subprocess(Process):
def __init__(self, name):
Process.__init__(self)
self.name = name
def run(self):
print(f"[sub] {self.name} start")
time.sleep(5)
print(f"[sub] {self.name} end")
if __name__ == "__main__":
print("[main] start")
p = Subprocess(name='startcoding')
p.start()
time.sleep(1)
# 프로세스가 살아있는지 검사한 후 살아있으면 강제종료
if p.is_alive:
p.terminate()
print("[main] end")
추후에 아래 내용을 살펴볼 것이다.
- 스레드간 데이터 처리 (lock)
- 프로세스간 데이터 전송 (Queue, Pipe)
- 속도 비교
- 운영체제와 메모리