>  기사  >  Python 스레드 풀과 멀티스레딩의 차이점

Python 스레드 풀과 멀티스레딩의 차이점

zbt
zbt원래의
2023-06-20 16:51:351290검색

파이썬 스레드 풀과 멀티스레딩의 차이점: 1. 스레드는 프로세스 아래로 이동합니다. 3. 프로세스는 여러 스레드를 포함할 수 있습니다. 4. 서로 다른 프로세스 간에 데이터를 공유하기가 어렵습니다. . 프로세스는 스레드보다 더 많은 컴퓨터 리소스를 소비합니다.

Python 스레드 풀과 멀티스레딩의 차이점

1. 스레드 및 멀티 스레드

프로세스: 프로그램이 실행될 때 실행 중인 프로그램과 프로그램에서 사용하는 메모리 및 시스템 리소스를 포함하는 프로세스라고 할 수 있습니다. 다중 스레드로 구성됨

스레드: 스레드는 프로그램의 실행 흐름입니다. 각 스레드는 자체 전용 레지스터를 가지며, 코드 영역은 공유됩니다.

멀티 스레딩: 멀티 스레딩은 프로그램에 여러 실행 스트림이 포함되어 있음을 의미합니다. 즉, 프로그램이 여러 다른 스레드를 동시에 실행하여 다른 작업을 수행할 수 있으므로 단일 프로그램이 여러 병렬 실행 스레드를 생성하여 해당 작업을 완료할 수 있음을 의미합니다.

멀티 스레딩의 가장 큰 이점: CPU 활용도 향상(특히 I/O 집약적인 프로그램에 적합하며 속도 향상이 특히 두드러집니다)

프로세스와 스레드의 차이점:

간단한 비유: 프로세스 = 트레인, 스레드 = 캐리지

스레드는 프로세스 아래에서 이동합니다(간단한 캐리지는 실행할 수 없음)

프로세스에는 여러 스레드가 포함될 수 있습니다(열차에는 ​​여러 캐리지가 있을 수 있음)

서로 다른 프로세스 간에 데이터를 공유하기 어렵습니다(열차에 탑승한 승객에게는 어렵습니다). 역 환승 등 다른 열차로 변경)

동일 프로세스 내 서로 다른 스레드 간에 데이터 공유가 용이함(객차 A에서 열차 B로 변경이 용이함)

프로세스가 스레드보다 더 많은 컴퓨터 리소스를 소비함(여러 열차 사용) 여러 객차보다 더 많은 리소스를 소비합니다)

프로세스는 서로 영향을 미치지 않습니다. 하나의 스레드가 중단되면 전체 프로세스가 중단됩니다(한 열차는 다른 열차에 영향을 미치지 않지만 열차의 중간 객차에 화재가 영향을 미칩니다). 모든 객차)

프로세스를 여러 기계로 확장할 수 있으며 프로세스는 최대 멀티 코어에 적합합니다(다른 열차가 여러 선로에서 운행될 수 있으며, 동일한 열차의 객차가 다른 선로에 있을 수 없음)

프로세스 use 메모리 주소를 잠글 수 있습니다. 즉, 스레드가 일부 공유 메모리를 사용할 때 다른 스레드는 이 메모리 조각을 사용하기 전에 해당 주소가 끝날 때까지 기다려야 합니다. (예를 들어 기차의 화장실) - "뮤텍스 잠금"

프로세스에서 사용되는 메모리 주소는 사용을 제한할 수 있습니다. (예를 들어 기차의 레스토랑, 다음과 같은 경우 최대 인원만 입장이 허용됩니다. 꽉 차서 누군가 나올 때까지 문 앞에서 기다려야 합니다. 들어가려면) - "세마포어"

2. 멀티스레딩의 스레딩 클래스

스레딩 클래스는 가장 일반적으로 사용되는 멀티스레딩 모듈입니다.

threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, 
daemon=None)

group: 기본값은 None입니다.

target: To 실행되는 함수의 이름입니다.

name: 스레드 이름, 기본값은 'Thread-N'입니다. ' form.

args: 매개변수 대상에 전달된 호출 가능 객체의 매개변수 튜플.

kwargs: 매개변수 대상에 전달된 호출 가능 객체의 키워드 매개변수 사전.

daemon: Guardian 모드 속성, 기본값은 None입니다. 스레드 개체의 중요한 메서드:

start(): 스레드를 시작합니다.

run(): 이 메서드는 스레드 활동을 나타냅니다. ): 현재 호출자 스레드가 스레드가 끝날 때까지 기다리도록 합니다.

daemon: 스레드가 데몬 스레드인지 여부, True 또는 False를 나타냅니다.

멀티 스레드 인스턴스 만들기:

import random
import threading
import time
def awesome_function(name):
wait_time = random.randint(1, 10)
print('current thread name is :{0} and wait {1} s'.format(name, 
wait_time))
time.sleep(wait_time)
print('thread {} finished.'.format(name))
if __name__ == '__main__':
for i in range(0, 3):
t = threading.Thread(target=awesome_function, args=(i,))
t.start()

먼저 살펴볼 수 있습니다. 내가 기록한 실행 결과:

위의 예에서는 3개의 스레드가 동시에 작업을 실행합니다. 작업을 먼저 완료합니다. 스레드(가장 짧은 시간을 가진 스레드)가 먼저 결과를 출력합니다.

세번째. 사용된 스레드 풀 클래스 ThreadPoolExecutor

새 스레드를 시작하는 것은 운영 체제와의 상호 작용을 포함하기 때문에 매우 비쌉니다. 이 경우 스레드 풀을 사용하면 프로그램 성능이 크게 향상될 수 있습니다. 특히 프로그램이 매우 많은 수의 스레드를 생성해야 할 때 더욱 그렇습니다. 수명이 짧다면 스레드 풀 사용을 고려해야 합니다.

스레드 풀은 시스템이 시작될 때 많은 수의 유휴 스레드를 생성하며, 함수가 스레드 풀에 제출되는 한 스레드 풀은 유휴 스레드를 시작합니다. 함수가 종료되면 스레드는 죽지 않고 다시 스레드 풀로 돌아가 유휴 상태가 되며 Next 함수를 기다리게 됩니다. 동시에 스레드 풀을 사용하면 해당 스레드의 동시 스레드 수를 효과적으로 제어할 수 있습니다. 시스템에 많은 수의 동시 스레드가 포함되어 있으면 시스템 성능이 급격히 저하되고 심지어 Python 인터프리터가 충돌할 수도 있습니다. 최대 스레드 풀 스레드 수 매개변수는 시스템의 동시 스레드 수를 제어할 수 있습니다.

현재 주류로 사용되는 스레드 풀은 Concurrent.futures 모듈의 ThreadPoolExecutor입니다.

import random
import time
from concurrent.futures import ThreadPoolExecutor
def awesome_function(name):
wait_time = random.randint(1, 10)
print('current thread name is :{0} and wait {1} s'.format(name, 
wait_time))
time.sleep(wait_time)
print('thread {} finished.'.format(name))
if __name__ == '__main__':
with ThreadPoolExecutor(max_workers=3) as t:
for i in range(0, 3):
t.submit(awesome_function, i)

실행 결과는 다음과 같이 기록됩니다.

최대 3개 스레드 용량의 스레드 풀을 만듭니다. pool 개체에 있는 스레드(thread.pool)에 있는 스레드가 있는 경우 실행된 함수를 스레드 풀에 제출합니다. 2) 실행이 완료되면 유휴 스레드(스레드 3)가 풀에 들어가는 방식으로 모든 스레드가 완료될 때까지 프로그램이 종료됩니다.

위 내용은 Python 스레드 풀과 멀티스레딩의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.