Heim  >  Artikel  >  Backend-Entwicklung  >  Effizienzvergleichsexperiment von Single-Thread, Multi-Thread und Multi-Prozess in Python

Effizienzvergleichsexperiment von Single-Thread, Multi-Thread und Multi-Prozess in Python

高洛峰
高洛峰Original
2016-11-16 10:10:081649Durchsuche

Vergleichsexperimente

Daten zeigen, dass Multithreading die Effizienz nicht wesentlich verbessert, wenn der Multithread-Prozess CPU-intensiv ist. Im Gegenteil, die Effizienz kann aufgrund des häufigen Threadwechsels abnehmen . Es wird empfohlen, einen Multiprozess zu verwenden. Wenn er IO-intensiv ist, kann der Multithread-Prozess die Leerlaufzeit nutzen, während er auf die IO-Blockierung wartet, um andere Threads auszuführen, um die Effizienz zu verbessern. Wir vergleichen also die Effizienz verschiedener Szenarien auf der Grundlage von Experimenten

|-----------|------. -|- -----|--------|.
| >

(2) CPU-intensive Berechnungsfunktionen definieren

import requests
import time
from threading import Thread
from multiprocessing import Process
(3) E/A-intensive Funktionen zum Lesen und Schreiben von Dateien definieren

def count(x, y):
    # 使程序完成150万计算
    c = 0
    while c < 500000:
        c += 1
        x += x
        y += y
(4) Definieren Netzwerkanforderungsfunktionen

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()
(5) Testen Sie die Zeit, die für die lineare Ausführung von E/A-intensiven Vorgängen, CPU-intensiven Vorgängen und Netzwerkanforderungsintensiven Vorgängen

_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}
Ausgabe

CPU-intensive: 95.6059999466, 91.57099986076355 92.52800011634827, 99.96799993515015

# 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)
IO intensive: 24.25, 21.76699995994568, 21.769999980926 514, 22.060999870300293

Network request intensive: 4.519999980926514, 8.563999891281128, 4.371000051498413, 4.522000074386597, 14.671000003 814697

(6 )Testen Sie die Zeit, die Multithreads benötigen, um gleichzeitig CPU-intensive Vorgänge auszuführen

Ausgabe: 99.9240000248, 101.26400017738342, 102.3220000267 0288

(7 ) Testen Sie die Zeit, die Multithreads für die gleichzeitige Ausführung von E/A-intensiven Vorgängen benötigen

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)

Ausgabe: 25.69700002670288, 24.02400016784668

(8) Testen Sie die Zeit, die für die gleichzeitige Ausführung von Multithreads erforderlich ist Netzwerkintensive Vorgänge

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)

Ausgabe: 0,7419998645782471, 0,38 39998245239258, 0,3900001049041748

(9) Testen Sie die Zeit, die mehrere Prozesse benötigen, um gleichzeitig CPU-intensive Vorgänge auszuführen

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)

Ausgabe: 54.342000007629395, 53.437999963760376

(10) Testen Sie mehrere Prozesse, um IO-intensive Vorgänge gleichzeitig auszuführen

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)

Ausgabe: 12.509000062942505, 13.0590 00015258789

(11) Testen der gleichzeitigen Ausführung von HTTP-Anforderungsintensiven Vorgängen durch mehrere Prozesse

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)

Ausgabe: 0,5329999923 706055, 0,4760000705718994

Experimentelle Ergebnisse

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)

Anhand der obigen Ergebnisse können wir sehen:

Multi-Threading scheint bei IO-intensiven Vorgängen nicht sehr wichtig zu sein (vielleicht werden sich die Vorteile widerspiegeln, wenn die IO-Operationsaufgabe schwerer ist). Bei CPU-intensiven Vorgängen ist die Leistung offensichtlich schlechter als bei der linearen Ausführung mit einem Thread. Bei Vorgängen wie Netzwerkanforderungen, bei denen beschäftigtes Warten den Thread blockiert, sind jedoch viele Die Vorteile von Threads sind sehr bedeutsam Effizienzvergleichsexperiment von Single-Thread, Multi-Thread und Multi-Prozess in Python

Mehrere Prozesse können gezeigt werden Leistungsvorteile, egal ob CPU-intensiv, IO-intensiv oder netzwerkanforderungsintensiv (es kommt häufig zu Thread-Blockierungsvorgängen). Für netzwerkanforderungsintensive Vorgänge ist es jedoch fast dasselbe wie Multithreading, beansprucht jedoch mehr Ressourcen wie CPU. In diesem Fall können wir also Multithreading für die Ausführung auswählen

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn