之前我們分別對計算密集型和io密集型任務,測試過多執行緒對執行效率的改進,下面我們依然分計算密集、檔案讀寫、網路請求三個部分,測試使用執行緒池、程序池如何改進執行效率
首先導入庫並定義三種任務的函式
import requests
from bs4 import beautifulsoup
import time
import numpy as np
from multiprocessing.dummy import pool as threadpool
from multiprocessing import pool
# 計算從1加到50000000
defcal
(a = none):
# 引數i沒用,只是為了和後面統一
s = 0
for i in range(50000000):
s = s + i
# 5000000次寫入檔案
deffile
(a = none):
# 引數i沒用,只是為了和後面統一
with open('try.txt', 'w') as f:
for i in range(5000000):
f.write('abcd\n')
# 抓取豆瓣top250的10個網頁
defgettitle
(a):
url = ''.format(a*25)
r = requests.get(url)
soup = beautifulsoup(r.content, 'html.parser')
lis = soup.find('ol', class_='grid_view').find_all('li')
for li in lis:
title = li.find('span', class_="title").text
print(title)
複製**
下面定義線性計算、多執行緒、多程序的函式
# 分別將上面三個函式傳入,計算10次,返回正常迴圈的執行總時間
def nothing(func):
t = time.time
()foriin
range
(10):
func
(i)duration = time.time
() - t
return
duration
# 分別將上面三個函式傳入,計算10次,返回使用多執行緒的執行總時間
defthread
(func):
t = time.time
()pool = threadpool
(4)pool.map
(func, range(10))
duration = time.time
() - t
return
duration
# # 分別將上面三個函式傳入,計算10次,返回使用多程序的執行總時間
defprocess
(func):
t = time.time
()pool = pool
(4)pool.map
(func, range(10))
duration = time.time
() - t
return
duration
複製**
下面定義計算執行時間的函式
def
get_duration
(curr, func):
下面執行**計算時間
if __name__ == '__main__':
# cpu密集任務對比
print(get_duration(nothing, cal))
print(get_duration(thread, cal))
print(get_duration(process, cal))
# 檔案讀寫任務對比
print(get_duration(nothing, file))
print(get_duration(thread, file))
print(get_duration(process, file))
# 網路請求任務對比
print(get_duration(nothing, gettitle))
print(get_duration(thread, gettitle))
print(get_duration(process, gettitle))
複製**
結果如下
------cpu密集型任務執行時間-------
線性運算
('39.98', ['39.57', '39.36', '40.53', '40.09', '40.35'])
多執行緒('38.31', ['39.07', '37.96', '38.07', '38.31', '38.13'])
多程序('27.43', ['27.58', '27.11', '27.82', '27.53', '27.11'])
------檔案讀寫任務執行時間-------
線性運算
('54.11', ['53.54', '53.96', '54.46', '53.54', '55.03'])
多執行緒('53.86', ['55.44', '54.12', '52.48', '53.17', '54.08'])
多程序('34.98', ['35.14', '34.35', '35.27', '35.20', '34.94'])
------網路請求任務執行時間-------
線性運算
('4.77', ['4.74', '4.70', '4.77', '4.91', '4.72'])
多執行緒('1.96', ['1.88', '2.09', '1.91', '2.04', '1.91'])
多程序('3.79', ['3.55', '3.70', '3.50', '3.92', '4.30'])
複製**
分析如下
將file
函式改為(即每次寫入內容增多)
# 500次寫入檔案
deffile
(a = none):
# 引數i沒用,只是為了和後面統一
for i in range(500):
with open('try.txt', 'w') as f:
f.write('abcd'*100000 + '\n')
複製**
執行結果如下
線性運算
('55.15', ['49.96', '55.75', '45.11', '52.16', '72.75'])
多執行緒('26.57', ['26.67', '23.89', '25.48', '32.84', '23.94'])
多程序('25.72', ['24.10', '25.82', '24.13', '28.03', '26.50'])
複製**
可以看出這種情況下,多執行緒對效率的改善程度和多程序差不多。
專欄主頁:python程式設計
專欄目錄:目錄
版本說明:軟體及包版本說明
程序池 執行緒池
程序池和執行緒池相似,所以這裡我們以程序池為例介紹,下面對程序池的討論完全適用於執行緒池 如果沒有特殊宣告 程序池是由伺服器預先建立的一組子程序,這些子程序的數目在3 10個之間 典型情況 執行緒池的數量應該和cpu數量差不多。程序池中的所有子程序都執行者相同的 並具有相同的屬性。因為程序池在伺服器...
執行緒池 程序池
執行緒池 程序池 池子解決什麼問題?1.建立 銷毀執行緒伴隨著系統開銷,如果過於頻繁會影響系統執行效率 2.執行緒併發數量過多,搶占系統資源,從而導致系統阻塞甚至宕機 3.能夠剛好的控制和管理池子裡面的執行緒和程序 concurrent.futures模組提供了高度封裝的非同步呼叫介面 thread...
程序池, 執行緒池
知識儲備 池 裝載固定數量介質,該介質值得是程序或者執行緒 為什麼要用?讓機器在自己可承受的範圍內去保證乙個高效的工作 from concurrent.futures import processpoolexecutor,threadpoolexecutor pool processpoolexec...