程序池 執行緒池效率測試

2021-09-11 13:01:46 字數 3698 閱讀 7721

之前我們分別對計算密集型和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...