일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- linux job
- C언어
- 데이터 직렬화 포맷
- gitlab
- 3D 프린터 용어
- nas
- 3D프린터입문
- 3D프린터
- octoprint
- 3d프린터 초보
- Token인증방식
- Notification
- 3D모델링
- docker
- data serialization formats
- NAS HDD교체
- Kotlin
- 네이버클라우드
- docker container
- 코틀린개발환경
- OnlineIDE
- Jenkins
- 리눅스 파일동기화
- 3D
- ci/cd
- IoTNetwork
- github
- kubernetes
- 3D프린터 입문
- git
- Today
- Total
0과 1을 공부하다.
[Python] 멀티 쓰레드(Multi-Thread) 예제 본문
개요
본 게시물에서는 Python의 멀티 쓰레드 예제를 알아본다.
파이썬은 기본적으로 인터프리터 언어로 싱글 스레드로 실행한다. 프로그램을 작성하다보면 여러 가지 일을 동시에 실행하는 동시성이 필요한데 동시에 여러 가지 일을 수행하기 위해서는 프로그램의 병렬처리가 필요하다. 프로그램의 병렬처리를 위해서는 멀티 쓰레드에 대한 개념과 멀티 프로세스에 대한 개념을 이용한다.
쓰레드와 프로세스의 간략한 개념은 아래와 같다.
Process
- 단순히 실행 중인 프로그램이라고 할 수 있다.
- 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.
- 프로세스는 프로그램에서 사용되는 데이터와 메모리 등의 자원 그리고 쓰레드로 구성된다.
- 프로세스간의 자원공유는 이뤄지지 않는다.
Thread
- 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
- 모든 프로세스에는 한 개 이상의 쓰레드가 존재하며 작업을 수행한다.
- 두 개 이상의 쓰레드를 가지는 프로세스를 멀티 쓰레드 프로세스(Multi-Threaded Process)라고 한다.
- 스레드간 자원공유를 할 수 있다.
Python Thread
먼저 두서없이 예제코드를 작성하고 코드에 대해 설명한다.
import threading
# 첫번째 실행할 쓰레드 함수
def first_thread(num):
print("first_thread function START")
for i in range(num):
print("1")
print("first_thread function END")
# 두번째 실행할 쓰레드 함수
def second_thread(num):
print("second_thread function START")
for i in range(num):
print("2")
print("second_thread function END")
# thread 생성(각 숫자를 5회 출력)
thread1 = threading.Thread(target=first_thread, args=(5,))
thread2 = threading.Thread(target=second_thread, args=(5,))
# thread 시작
thread1.start()
thread2.start()
- python에서 멀티쓰레드를 사용하기 위해 threading 모듈을 import 한다.
import threading
- 쓰레드를 실행할 함수를 작성하고, Thread 메소드를 통해 실행할 쓰레드를 생성한다.
thread1 = threading.Thread(target=first_thread, args=(5,))
- 생성된 쓰레드를 start() 메소드를 이용하여 실행한다.
thread1.start()
위 코드를 실행한 결과는 아래와 같다.
실행 결과 thread1을 먼저 실행하였지만 종료되지 않고 thread2가 실행되는 모습을 볼 수 있다.
이러한 이유는 OS의 스케쥴링에 있다. thread1.start()를 실행하였을 때 쓰레드는 바로 실행되는 것이 아니라 실행대기 상태가 된다. 이후 쓰레드는 OS의 스케쥴링에 따라 실행되게 된다. 즉, 쓰레드는 개발자가 작성한 코드라인 순서대로 실행되지 않고 컴퓨터의 성능에 따라 매번 실행 순서의 결과가 다르게 나타나게 된다.
만약, 코드의 흐름의 의도에 따라 thread1의 스레드를 먼저 실행하고 종료 후에 thread2를 사용하고 싶다면 join() 메소드를 이용하면 된다. join() 메소드는 자식 쓰레드의 실행을 기다리고 종료된 이후에 부모쓰레드를 실행하는 메소드이다.
thread1.join()
join() 메소드를 실행하면 몇 번을 실행하더라도 의도한 바와 같이 thread1이 실행되고 종료된 이후에 실행됨을 확인할 수 있다.
참고문헌
- https://velog.io/@khsb2012/java-study-week10
- https://burningrizen.tistory.com/244
- https://monkey3199.github.io/develop/python/2018/12/04/python-pararrel.html
※ 본 게시글의 정보가 잘못 되었거나 부족한 부분에 대한 피드백을 환영합니다.
* CopyRight 2022. Jay Park All rights reserved.
'Study > python' 카테고리의 다른 글
[Python] 파이썬 터미널 실행 매개변수 전달 (0) | 2022.04.01 |
---|