이 문서에서는 Python 프로그래밍 언어의 멀티스레딩에 대한 기본 사항을 다룹니다. 처럼 다중 처리 , 멀티스레딩은 멀티태스킹을 달성하는 방법입니다. 멀티스레딩의 개념 스레드 사용. 먼저 의 개념을 이해해보자 실 컴퓨터 아키텍처에서.
Python의 프로세스란 무엇입니까?
컴퓨팅에서는 프로세스 실행되고 있는 컴퓨터 프로그램의 인스턴스입니다. 모든 프로세스에는 3가지 기본 구성요소가 있습니다.
- 실행 가능한 프로그램입니다.
- 프로그램에 필요한 관련 데이터(변수, 작업 공간, 버퍼 등)
- 프로그램의 실행 컨텍스트(프로세스 상태)
Python 스레딩 소개
ㅏ 실 실행을 예약할 수 있는 프로세스 내의 엔터티입니다. 또한 OS(운영체제)에서 수행할 수 있는 가장 작은 처리 단위이다. 간단히 말해서, 스레드는 다른 코드와 독립적으로 실행될 수 있는 프로그램 내 명령의 시퀀스입니다. 단순화를 위해 스레드는 단순히 프로세스의 하위 집합이라고 가정할 수 있습니다! 스레드에는 이 모든 정보가 포함되어 있습니다. 스레드 제어 블록 (TCB) :
- 스레드 식별자: 모든 새 스레드에는 고유 ID(TID)가 할당됩니다.
- 스택 포인터: 프로세스의 스레드 스택을 가리킵니다. 스택에는 스레드 범위 아래의 지역 변수가 포함되어 있습니다.
- 프로그램 카운터: 현재 스레드에 의해 실행되고 있는 명령어의 주소를 저장하는 레지스터.
- 스레드 상태: 실행 중, 준비 중, 대기 중, 시작 중 또는 완료될 수 있습니다.
- 스레드의 레지스터 세트: 계산을 위해 스레드에 할당된 레지스터입니다.
- 상위 프로세스 포인터: 스레드가 있는 프로세스의 프로세스 제어 블록(PCB)에 대한 포인터입니다.
프로세스와 스레드 간의 관계를 이해하려면 아래 다이어그램을 고려하십시오.

프로세스와 스레드 간의 관계
다음과 같은 경우 하나의 프로세스 내에 여러 스레드가 존재할 수 있습니다.
- 각 스레드는 자신만의 스레드를 포함합니다. 레지스터 세트 그리고 지역 변수(스택에 저장됨) .
- 프로세스의 모든 스레드는 공유합니다. 전역 변수(힙에 저장됨) 그리고 프로그램 코드 .
메모리에 여러 스레드가 존재하는 방식을 이해하려면 아래 다이어그램을 고려하십시오.

메모리에 다중 스레드 존재
Python의 스레딩 소개
멀티스레딩 여러 스레드를 동시에 실행하는 프로세서의 능력으로 정의됩니다. 간단한 단일 코어 CPU에서는 스레드 간 빈번한 전환을 사용하여 달성됩니다. 이것을 칭한다 컨텍스트 전환 . 컨텍스트 전환에서는 인터럽트(I/O 또는 수동 설정으로 인해)가 발생할 때마다 스레드의 상태가 저장되고 다른 스레드의 상태가 로드됩니다. 컨텍스트 전환이 너무 자주 발생하여 모든 스레드가 병렬로 실행되는 것처럼 보입니다. 멀티태스킹 ).
프로세스에 두 개의 활성 스레드가 포함되어 있는 아래 다이어그램을 살펴보세요.

멀티스레딩
Python의 멀티스레딩
~ 안에 파이썬 , 스레딩 모듈은 프로그램에서 여러 스레드를 생성하기 위한 매우 간단하고 직관적인 API를 제공합니다. 멀티스레딩 코드를 단계별로 이해해 보겠습니다.
1 단계: 가져오기 모듈
C# 스위치
먼저 스레딩 모듈을 가져옵니다.
import threading>
2 단계: 스레드 생성
새로운 스레드를 생성하기 위해 우리는 실 수업. 매개변수로 'target'과 'args'를 사용합니다. 그만큼 표적 스레드에 의해 실행되는 함수인 반면 인수는 대상 함수에 전달할 인수입니다.
t1 = threading.Thread(target, args) t2 = threading.Thread(target, args)>
3단계: 스레드 시작
스레드를 시작하려면 다음을 사용합니다. 시작() Thread 클래스의 메소드
t1.start() t2.start()>
4단계: 스레드 실행 종료
스레드가 시작되면 현재 프로그램(메인 스레드처럼 생각할 수 있음)도 계속 실행됩니다. 스레드가 완료될 때까지 현재 프로그램의 실행을 중지하려면 다음을 사용합니다. 가입하다() 방법.
t1.join() t2.join()>
결과적으로 현재 프로그램은 먼저 작업이 완료될 때까지 기다립니다. t1 그런 다음 t2 . 일단 완료되면 현재 프로그램의 나머지 명령문이 실행됩니다.
예:
스레딩 모듈을 사용하는 간단한 예를 살펴보겠습니다.
이 코드는 Python의 스레딩 모듈을 사용하여 숫자의 제곱과 세제곱을 동시에 계산하는 방법을 보여줍니다. 두 개의 스레드, t1> 그리고 t2> 는 이러한 계산을 수행하기 위해 생성됩니다. 시작되고 결과는 프로그램이 완료를 인쇄하기 전에 병렬로 인쇄됩니다! 두 스레드가 모두 완료되면. 스레딩은 계산 집약적인 작업을 처리할 때 병렬성을 달성하고 프로그램 성능을 향상시키는 데 사용됩니다.
파이썬3
네트워크 유형
import> threading> def> print_cube(num):> >print>(>'Cube: {}'> .>format>(num>*> num>*> num))> def> print_square(num):> >print>(>'Square: {}'> .>format>(num>*> num))> if> __name__>=>=>'__main__'>:> >t1>=> threading.Thread(target>=>print_square, args>=>(>10>,))> >t2>=> threading.Thread(target>=>print_cube, args>=>(>10>,))> >t1.start()> >t2.start()> >t1.join()> >t2.join()> >print>(>'Done!'>)> |
>
>
산출:
Square: 100 Cube: 1000 Done!>
위 프로그램의 작동 방식을 더 잘 이해하려면 아래 다이어그램을 고려하십시오.

멀티스레딩
예:
이 예에서는 os.getpid() 현재 프로세스의 ID를 가져오는 함수입니다. 우리는 사용 threading.main_thread() 메인 스레드 객체를 가져오는 함수입니다. 정상적인 조건에서 메인 스레드는 Python 인터프리터가 시작된 스레드입니다. 이름 스레드 개체의 속성은 스레드 이름을 가져오는 데 사용됩니다. 그런 다음 우리는 threading.current_thread() 현재 스레드 개체를 가져오는 함수입니다.
각 작업에 대한 스레드 이름과 해당 프로세스를 인쇄하는 아래 Python 프로그램을 고려하십시오.
이 코드는 Python의 스레딩 모듈을 사용하여 두 작업을 동시에 실행하는 방법을 보여줍니다. 메인 프로그램은 두 개의 스레드를 시작합니다. t1> 그리고 t2> , 각각은 특정 작업 실행을 담당합니다. 스레드는 병렬로 실행되며 코드는 프로세스 ID 및 스레드 이름에 대한 정보를 제공합니다. 그만큼os>모듈은 프로세스 ID에 액세스하는 데 사용되며 ' threading'> 모듈은 스레드와 스레드 실행을 관리하는 데 사용됩니다.
파이썬3
import> threading> import> os> def> task1():> >print>(>'Task 1 assigned to thread: {}'>.>format>(threading.current_thread().name))> >print>(>'ID of process running task 1: {}'>.>format>(os.getpid()))> def> task2():> >print>(>'Task 2 assigned to thread: {}'>.>format>(threading.current_thread().name))> >print>(>'ID of process running task 2: {}'>.>format>(os.getpid()))> if> __name__>=>=> '__main__'>:> >print>(>'ID of process running main program: {}'>.>format>(os.getpid()))> >print>(>'Main thread name: {}'>.>format>(threading.current_thread().name))> >t1>=> threading.Thread(target>=>task1, name>=>'t1'>)> >t2>=> threading.Thread(target>=>task2, name>=>'t2'>)> >t1.start()> >t2.start()> >t1.join()> >t2.join()> |
>
>
산출:
ID of process running main program: 1141 Main thread name: MainThread Task 1 assigned to thread: t1 ID of process running task 1: 1141 Task 2 assigned to thread: t2 ID of process running task 2: 1141>
아래에 주어진 다이어그램은 위의 개념을 명확하게 합니다.

멀티스레딩
이상으로 Python의 멀티스레딩에 대해 간략하게 소개했습니다. 이 시리즈의 다음 기사에서는 다음 내용을 다룹니다. 여러 스레드 간의 동기화 . Python의 멀티스레딩 | 세트 2(동기화)
파이썬 스레드풀
스레드 풀은 미리 생성되어 여러 작업을 실행하는 데 재사용할 수 있는 스레드 모음입니다. Python의 Concurrent.futures 모듈은 스레드 풀을 쉽게 생성하고 관리할 수 있게 해주는 ThreadPoolExecutor 클래스를 제공합니다.
이 예에서는 스레드에서 실행될 함수 작업자를 정의합니다. 최대 2개의 작업자 스레드로 ThreadPoolExecutor를 생성합니다. 그런 다음 submit 메소드를 사용하여 두 개의 작업을 풀에 제출합니다. 풀은 작업자 스레드의 작업 실행을 관리합니다. 메인 스레드가 계속되기 전에 모든 작업이 완료될 때까지 기다리기 위해 shutdown 메서드를 사용합니다.
멀티스레딩은 프로그램의 효율성과 반응성을 높이는 데 도움이 됩니다. 그러나 경쟁 조건 및 교착 상태와 같은 문제를 방지하려면 스레드로 작업할 때 주의하는 것이 중요합니다.
이 코드는 다음으로 생성된 스레드 풀을 사용합니다. concurrent.futures.ThreadPoolExecutor> 두 개의 작업자 작업을 동시에 실행합니다. 메인 스레드는 작업자 스레드가 사용을 완료할 때까지 기다립니다. pool.shutdown(wait=True)> . 이를 통해 다중 스레드 환경에서 작업을 효율적으로 병렬 처리할 수 있습니다.
파이썬3
직원 선발 커미션의 의미
import> concurrent.futures> def> worker():> >print>(>'Worker thread running'>)> pool>=> concurrent.futures.ThreadPoolExecutor(max_workers>=>2>)> pool.submit(worker)> pool.submit(worker)> pool.shutdown(wait>=>True>)> print>(>'Main thread continuing to run'>)> |
>
>산출
Worker thread running Worker thread running Main thread continuing to run>