摘要:中單線程多線程與多進程的效率對比實驗多線程多進程中多線程和多進程的對比是運行在解釋器中的語言,查找資料知道,中有一個全局鎖,在使用多進程的情況下,不能發揮多核的優勢。
title: Python中單線程、多線程與多進程的效率對比實驗
date: 2016-09-30 07:05:47
tags: [多線程,多進程,Python]
categories: [Python]
Python是運行在解釋器中的語言,查找資料知道,python中有一個全局鎖(GIL),在使用多進程(Thread)的情況下,不能發揮多核的優勢。而使用多進程(Multiprocess),則可以發揮多核的優勢真正地提高效率。
資料顯示,如果多線程的進程是CPU密集型的,那多線程并不能有多少效率上的提升,相反還可能會因為線程的頻繁切換,導致效率下降,推薦使用多進程;如果是IO密集型,多線程進程可以利用IO阻塞等待時的空閑時間執行其他線程,提升效率。所以我們根據實驗對比不同場景的效率
操作系統 | CPU | 內存 | 硬盤 |
---|---|---|---|
Windows 10 | 雙核 | 8GB | 機械硬盤 |
import requests import time from threading import Thread from multiprocessing import Process
def count(x, y): # 使程序完成50萬計算 c = 0 while c < 500000: c += 1 x += x y += y
def write(): f = open("test.txt", "w") for x in range(5000000): f.write("testwrite ") f.close() def read(): f = open("test.txt", "r") lines = f.readlines() f.close()
_head = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"} 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}
# 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.96799993515015 |
IO密集 | 24.25 | 21.76699995994568 | 21.769999980926514 | 22.060999870300293 |
網絡請求密集型 | 4.519999980926514 | 8.563999891281128 | 4.371000051498413 | 14.671000003814697 |
counts = [] t = time.time() for x in range(10): thread = Thread(target=count, args=(1,1)) counts.append(thread) thread.start() while True: e = len(counts) for th in counts: if not th.is_alive(): e -= 1 if e <= 0: break print(time.time() - t)
output |
---|
99.9240000248 |
101.26400017738342 |
102.32200002670288 |
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() while True: e = len(ios) for th in ios: if not th.is_alive(): e -= 1 if e <= 0: break print(time.time() - t)
Output |
---|
25.69700002670288 |
24.02400016784668 |
t = time.time() ios = [] t = time.time() for x in range(10): thread = Thread(target=http_request) ios.append(thread) thread.start() while True: e = len(ios) for th in ios: if not th.is_alive(): e -= 1 if e <= 0: break print("Thread Http Request", time.time() - t)
Output |
---|
0.7419998645782471 |
0.3839998245239258 |
0.3900001049041748 |
counts = [] t = time.time() for x in range(10): process = Process(target=count, args=(1,1)) counts.append(process) process.start() while True: e = len(counts) for th in counts: if not th.is_alive(): e -= 1 if e <= 0: break print("Multiprocess cpu", time.time() - t)
Output |
---|
54.342000007629395 |
53.437999963760376 |
t = time.time() ios = [] t = time.time() for x in range(10): process = Process(target=io) ios.append(process) process.start() while True: e = len(ios) for th in ios: if not th.is_alive(): e -= 1 if e <= 0: break print("Multiprocess IO", time.time() - t)
Output |
---|
12.509000062942505 |
13.059000015258789 |
t = time.time() httprs = [] t = time.time() for x in range(10): process = Process(target=http_request) ios.append(process) process.start() while True: e = len(httprs) for th in httprs: if not th.is_alive(): e -= 1 if e <= 0: break print("Multiprocess Http Request", time.time() - t)
|Output|
|0.5329999923706055|
|0.4760000705718994|
CPU密集型操作 | IO密集型操作 | 網絡請求密集型操作 | |
---|---|---|---|
線性操作 | 94.91824996469 | 22.46199995279 | 7.3296000004 |
多線程操作 | 101.1700000762 | 24.8605000973 | 0.5053332647 |
多進程操作 | 53.8899999857 | 12.7840000391 | 0.5045000315 |
通過上面的結果,我們可以看到:
多線程在IO密集型的操作下似乎也沒有很大的優勢(也許IO操作的任務再繁重一些就能體現出優勢),在CPU密集型的操作下明顯地比單線程線性執行性能更差,但是對于網絡請求這種忙等阻塞線程的操作,多線程的優勢便非常顯著了
多進程無論是在CPU密集型還是IO密集型以及網絡請求密集型(經常發生線程阻塞的操作)中,都能體現出性能的優勢。不過在類似網絡請求密集型的操作上,與多線程相差無幾,但卻更占用CPU等資源,所以對于這種情況下,我們可以選擇多線程來執行
此文為1年隨手寫的,多謝評論區指出謬誤,因數據是平均數,影響不大,故未做修改
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44266.html
摘要:批評的人通常都會說的多線程編程太困難了,眾所周知的全局解釋器鎖,或稱使得多個線程的代碼無法同時運行。多線程起步首先讓我們來創建一個名為的模塊。多進程可能比多線程更易使用,但需要消耗更大的內存。 批評 Python 的人通常都會說 Python 的多線程編程太困難了,眾所周知的全局解釋器鎖(Global Interpreter Lock,或稱 GIL)使得多個線程的 Python 代碼無...
摘要:使用進行并發編程篇三掘金這是使用進行并發編程系列的最后一篇。所以我考慮啟用一個本地使用進行并發編程篇二掘金我們今天繼續深入學習。 使用 Python 進行并發編程 - asyncio 篇 (三) - 掘金 這是「使用Python進行并發編程」系列的最后一篇。我特意地把它安排在了16年最后一天。 重新實驗上篇的效率對比的實現 在第一篇我們曾經對比并發執行的效率,但是請求的是httpb...
摘要:協程,又稱微線程,纖程。最大的優勢就是協程極高的執行效率。生產者產出第條數據返回更新值更新消費者正在調用第條數據查看當前進行的線程函數中有,返回值為生成器庫實現協程通過提供了對協程的基本支持,但是不完全。 協程,又稱微線程,纖程。英文名Coroutine協程看上去也是子程序,但執行過程中,在子程序內部可中斷,然后轉而執行別的子程序,在適當的時候再返回來接著執行。 最大的優勢就是協程極高...
摘要:多進程執行任務結束,創建進程和銷毀進程是時間的,如果長度不夠,會造成多線程快過多進程多線程執行任務結束,進程間通信生產者消費者模型與隊列演示了生產者和消費者的場景。 進程 Python是運行在解釋器中的語言,查找資料知道,python中有一個全局鎖(GIL),在使用多進程(Thread)的情況下,不能發揮多核的優勢。而使用多進程(Multiprocess),則可以發揮多核的優勢真正地提...
摘要:一般用進程池維護,的設為數量。多線程爬蟲多線程版本可以在單進程下進行異步采集,但線程間的切換開銷也會隨著線程數的增大而增大。異步協程爬蟲引入了異步協程語法。 Welcome to the D-age 對于網絡上的公開數據,理論上只要由服務端發送到前端都可以由爬蟲獲取到。但是Data-age時代的到來,數據是新的黃金,毫不夸張的說,數據是未來的一切。基于統計學數學模型的各種人工智能的出現...
閱讀 3723·2021-11-24 09:39
閱讀 1870·2021-11-16 11:45
閱讀 616·2021-11-16 11:45
閱讀 1028·2021-10-11 10:58
閱讀 2475·2021-09-09 11:51
閱讀 1941·2019-08-30 15:54
閱讀 687·2019-08-29 13:13
閱讀 3466·2019-08-26 12:18