>  기사  >  백엔드 개발  >  Python에서 멀티 프로세싱 또는 멀티 스레딩이 더 빠릅니까?

Python에서 멀티 프로세싱 또는 멀티 스레딩이 더 빠릅니까?

零下一度
零下一度원래의
2017-06-01 10:04:493032검색

다음 편집기에서는 Python 다중 프로세스와 다중 스레드 중 어느 것이 더 빠른지에 대한 기사(자세한 설명)를 가져올 것입니다. 에디터가 꽤 좋다고 생각해서 지금 공유해서 참고용으로 올려보겠습니다. 와서 저와 함께 살펴보세요

Python에서 멀티 프로세싱 또는 멀티 스레딩이 더 빠릅니까?

python3.6

스레딩 및 멀티프로세싱

쿼드 코어 + Samsung 250G-850-SSD

사용한 이후부터 다중 프로세스와 다중 스레드 프로그래밍 중 어느 것이 더 빠른지 아직도 모르겠습니다. 인터넷에서 많은 사람들은 GIL(Global Interpreter Lock) 때문에 Python 다중 프로세스가 더 빠르다고 말합니다. 그런데 코드를 작성할 때 멀티스레딩을 사용하면 테스트 시간이 더 빨라지는데 무슨 일이 벌어지고 있는 걸까요? 최근에 단어 분할 작업을 다시 하고 있는데 원본 코드가 너무 느려서 속도를 높이고 싶어서 효과적인 방법을 찾아보겠습니다. (문서 마지막에 코드와 렌더링이 있습니다)

결과는 다음과 같습니다. 어떤 스레드나 프로세스가 더 중요한지 설명하기 위한 프로그램 다이어그램 Fast

일부 정의

병렬이란 두 개 이상의 이벤트가 동시에 발생하는 것을 의미합니다. 동시성은 동일한 시간 간격 내에 두 개 이상의 이벤트가 발생하는 것을 의미합니다. 스레드는 운영 체제가 작업을 예약할 수 있는 가장 작은 단위입니다. 프로세스에 포함되며 프로세스에서 실제 작동하는 단위입니다. 프로그램의 실행 인스턴스는 프로세스입니다.

구현 프로세스파이썬의 멀티스레딩은 분명히 GIL을 얻고, 코드를 실행하고, 마지막으로 GIL을 해제해야 합니다. 그래서 GIL 때문에 여러 스레드를 사용할 때는 얻을 수 없습니다. 실제로는 동시 구현입니다. 즉, 동일한 시간 간격으로 여러 이벤트가 발생합니다.

하지만 프로세스에는 독립적인 GIL이 있으므로 병렬로 구현할 수 있습니다. 따라서 멀티 코어 CPU의 경우 이론적으로 여러 프로세스를 사용하면 리소스를 보다 효과적으로 활용할 수 있습니다.

실생활 문제온라인 튜토리얼에서 Python 멀티스레딩을 자주 볼 수 있습니다. 예를 들어 웹 크롤러 자습서 및 포트 검색 자습서가 있습니다.

포트 스캐닝을 예로 들어보겠습니다. 다중 프로세스를 사용하여 다음 스크립트를 구현할 수 있으며 Python 다중 프로세스가 더 빠르다는 것을 알 수 있습니다. 그렇다면 우리의 분석과 반대되는 것은 아닌가?

import sys,threading
from socket import *

host = "127.0.0.1" if len(sys.argv)==1 else sys.argv[1]
portList = [i for i in range(1,1000)]
scanList = []
lock = threading.Lock()
print('Please waiting... From ',host)


def scanPort(port):
  try:
    tcp = socket(AF_INET,SOCK_STREAM)
    tcp.connect((host,port))
  except:
    pass
  else:
    if lock.acquire():
      print('[+]port',port,'open')
      lock.release()
  finally:
    tcp.close()

for p in portList:
  t = threading.Thread(target=scanPort,args=(p,))
  scanList.append(t)
for i in range(len(portList)):
  scanList[i].start()
for i in range(len(portList)):
  scanList[i].join()

누가 더 빠릅니까파이썬 잠금 문제로 인해 스레드는 잠금을 놓고 경쟁하고 스레드를 전환하므로 리소스가 소모됩니다. 따라서 과감하게 추측해 봅시다.

CPU 집약적인 작업에서는 다중 처리가 더 빠르거나 더 효과적이며, IO 집약적인 작업에서는 멀티스레딩이 효율성을 효과적으로 향상시킬 수 있습니다.

아래 코드를 살펴보겠습니다.

import time
import threading
import multiprocessing

max_process = 4
max_thread = max_process

def fun(n,n2):
  #cpu密集型
  for i in range(0,n):
    for j in range(0,(int)(n*n*n*n2)):
      t = i*j

def thread_main(n2):
  thread_list = []
  for i in range(0,max_thread):
    t = threading.Thread(target=fun,args=(50,n2))
    thread_list.append(t)

  start = time.time()
  print(' [+] much thread start')
  for i in thread_list:
    i.start()
  for i in thread_list:
    i.join()
  print(' [-] much thread use ',time.time()-start,'s')

def process_main(n2):
  p = multiprocessing.Pool(max_process)
  for i in range(0,max_process):
    p.apply_async(func = fun,args=(50,n2))
  start = time.time()
  print(' [+] much process start')
  p.close()#关闭进程池
  p.join()#等待所有子进程完毕
  print(' [-] much process use ',time.time()-start,'s')

if name=='main':
  print("[++]When n=50,n2=0.1:")
  thread_main(0.1)
  process_main(0.1)
  print("[++]When n=50,n2=1:")
  thread_main(1)
  process_main(1)
  print("[++]When n=50,n2=10:")
  thread_main(10)
  process_main(10)

결과는 다음과 같습니다.

CPU 사용량이 점점 높아질수록(코드 루프가 많아질수록) 격차가 커지는 것을 알 수 있습니다. 점점 더 커지고 있어요. 추측 검증

CPU 및 IO 집약적1. CPU 집약적인 코드(다양한 루프 처리, 계산 등)


2. IO 집약적인 코드(파일 처리, 웹 크롤러 등)

판단 방법: 1. CPU 사용량과 하드 디스크 IO 읽기 및 쓰기 속도를 직접 살펴봅니다.


2. 추가 계산 -> CPU 대기 시간 증가(예: 웹 크롤러) ->IO


3. 바이두주세요

[관련 추천]

1.

Python의 다중 프로세스 및 다중 스레딩 예제(1)

2.

Python에서는 다중 프로세스를 사용하는 것이 좋습니다. 멀티 프로세스 사용을 권장하는 이유 공유

3.

파이썬의 멀티 프로세스 및 멀티 스레딩 예시 (2) 프로그래밍 방법

4

파이썬 프로세스, 스레드 및 코루틴에 대한 자세한 소개

5.

Python 동시성 프로그래밍 스레드 풀/프로세스 풀

위 내용은 Python에서 멀티 프로세싱 또는 멀티 스레딩이 더 빠릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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