Python에서 단일 스레드, 다중 스레드 및 다중 프로세스의 효율성 비교 실험

高洛峰
풀어 주다: 2016-11-22 10:45:01
원래의
1221명이 탐색했습니다.

비교 실험

데이터에 따르면 멀티 스레드 프로세스가 CPU 집약적이라면 멀티 스레드는 효율성을 크게 향상시키지 못하고 오히려 스레드를 자주 전환하여 효율성이 저하될 수 있습니다. . IO 집약적인 경우 멀티 프로세스를 사용하는 것이 좋습니다. 멀티 스레드 프로세스는 IO 차단이 다른 스레드를 실행하는 동안 유휴 시간을 사용하여 효율성을 높일 수 있습니다. 그래서 실험을 바탕으로 다양한 시나리오의 효율성을 비교합니다

Python에서 단일 스레드, 다중 스레드 및 다중 프로세스의 효율성 비교 실험

(1) 필수 모듈 소개

import requests
import time
from threading import Thread
from multiprocessing import Process
로그인 후 복사

(2) CPU 집약적 컴퓨팅 정의 기능

def count(x, y):
    # 使程序完成150万计算
    c = 0
    while c < 500000:
        c += 1
        x += x
        y += y
로그인 후 복사

(3) IO 집약적인 파일 읽기 및 쓰기 기능 정의

def write():
    f = open("test.txt", "w")
    for x in range(5000000):
        f.write("testwrite\n")
    f.close()

def read():
    f = open("test.txt", "r")
    lines = f.readlines()
    f.close()
로그인 후 복사

(4) 네트워크 요청 기능 정의

_head = {
            &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36&#39;}
url = "http://www.tieba.com"
def http_request():
    try:
        webPage = requests.get(url, headers=_head)
        html = webPage.text
        return {"context": html}
    except Exception as e:
        return {"error": e}
로그인 후 복사

(5) 테스트 선형성 IO 집약적 작업, CPU 집약적 작업 및 네트워크 요청 집약적 작업을 수행하는 데 필요한 시간

# CPU密集操作
t = time.time()
for x in range(10):
    count(1, 1)
print("Line cpu", time.time() - t)

# IO密集操作
t = time.time()
for x in range(10):
    write()
    read()
print("Line IO", time.time() - t)

# 网络请求密集型操作
t = time.time()
for x in range(10):
    http_request()
print("Line Http Request", time.time() - t)
로그인 후 복사

출력

CPU 집약적: 95.6059999466, 91.57099986076355 92.52800011634827, 99.967999 93515015

IO 집약적: 24.25, 21.76699995994568, 21.769999980926514, 22.060999870300293

네트워크 요청 집약적: 4.519999980926514, 8.56399989 1281128, 4.37 1000051498413, 4.522000074386597, 14.671000003814697

(6) 멀티 스레드 동시 테스트에 필요 CPU 집약적인 작업 실행 시간

counts = []
t = time.time()
for x in range(10):
    thread = Thread(target=count, args=(1,1))
    counts.append(thread)
    thread.start()

e = counts.__len__()
while True:
    for th in counts:
        if not th.is_alive():
            e -= 1
    if e <= 0:
        break
print(time.time() - t)
로그인 후 복사

출력: 99.9240000248, 101.26400017738342, 102.32200002670288

(7) IO 집약적인 작업의 멀티 스레드 동시 실행에 필요한 시간 테스트

def io():
    write()
    read()

t = time.time()
ios = []
t = time.time()
for x in range(10):
    thread = Thread(target=count, args=(1,1))
    ios.append(thread)
    thread.start()

e = ios.__len__()
while True:
    for th in ios:
        if not th.is_alive():
            e -= 1
    if e <= 0:
        break
print(time.time() - t)
로그인 후 복사

출력: 25.69700002670288, 24.02400016784668

(8) 네트워크 집약적인 작업의 멀티 스레드 동시 실행에 필요한 시간 테스트

t = time.time()
ios = []
t = time.time()
for x in range(10):
    thread = Thread(target=http_request)
    ios.append(thread)
    thread.start()

e = ios.__len__()
while True:
    for th in ios:
        if not th.is_alive():
            e -= 1
    if e <= 0:
        break
print("Thread Http Request", time.time() - t)
로그인 후 복사

출력: 0.741999864578247 1, 0.3839998245239258, 0.3900001049041748

(9) 다중 프로세스 동시성 테스트 CPU 집약적 작업을 수행하는 데 필요한 시간

counts = []
t = time.time()
for x in range(10):
    process = Process(target=count, args=(1,1))
    counts.append(process)
    process.start()
e = counts.__len__()
while True:
    for th in counts:
        if not th.is_alive():
            e -= 1
    if e <= 0:
        break
print("Multiprocess cpu", time.time() - t)
로그인 후 복사

출력: 54.342000007629395, 53.437999963760376

( 10) 동시 실행 테스트 여러 프로세스에 의한 IO 집약적인 작업

t = time.time()
ios = []
t = time.time()
for x in range(10):
    process = Process(target=io)
    ios.append(process)
    process.start()

e = ios.__len__()
while True:
    for th in ios:
        if not th.is_alive():
            e -= 1
    if e <= 0:
        break
print("Multiprocess IO", time.time() - t)
로그인 후 복사

출력: 12.509000062942505, 13.059000015258789

(11) HTTP 요청 집약적인 작업을 동시에 실행하기 위해 여러 프로세스 테스트

t = time.time()
httprs = []
t = time.time()
for x in range(10):
    process = Process(target=http_request)
    ios.append(process)
    process.start()

e = httprs.__len__()
while True:
    for th in httprs:
        if not th.is_alive():
            e -= 1
    if e <= 0:
        break
print("Multiprocess Http Request", time.time() - t)
로그인 후 복사

출력: 0.5329999923706055, 0.476000070571 8994

실험 결과

Python에서 단일 스레드, 다중 스레드 및 다중 프로세스의 효율성 비교 실험

위 결과를 통해 알 수 있습니다.

멀티 스레딩은 그렇지 않습니다. IO 집약적인 작업에 큰 이점이 있는 것 같습니다(아마도 IO 작업 작업이 더 무거워서 이점을 반영할 수 있음). CPU 집약적인 작업에서 단일 스레드의 선형 실행 성능은 분명히 단일 스레드의 성능보다 나쁩니다. 스레드를 차단하기 위해 대기하느라 바쁜 네트워크 요청과 같은 멀티스레딩의 장점은 매우 중요합니다

여러 프로세스는 CPU 집약적, IO 집약적, 네트워크 요청 집약적 작업(스레드 차단 작업이 자주 발생함)에서 성능 이점을 보여줄 수 있습니다. 그러나 네트워크 요청 집약적인 작업의 경우 멀티스레딩과 거의 동일하지만 CPU 등의 리소스를 더 많이 차지하므로 이 경우에는 멀티스레딩을 선택하여 실행하면 됩니다

Python에서 단일 스레드, 다중 스레드 및 다중 프로세스의 효율성 비교 실험

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿