>  기사  >  백엔드 개발  >  Python에서 단일 스레드, 다중 스레드 및 다중 프로세스의 효율성 비교 실험

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

高洛峰
高洛峰원래의
2016-11-22 10:45:011206검색

비교 실험

데이터에 따르면 멀티 스레드 프로세스가 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에서 단일 스레드, 다중 스레드 및 다중 프로세스의 효율성 비교 실험

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