目錄
在python中,計算密集型任務適用於多程序,io密集型任務適用於多執行緒
正常來講,多執行緒要比多程序效率更高,因為程序間的切換需要的資源和開銷更大,而執行緒相對更小,但是我們使用的python大多數的直譯器是cpython,眾所周知cpython有個gil鎖,導致執行計算密集型任務時多執行緒實際只能是單執行緒,而且由於執行緒之間切換的開銷導致多執行緒往往比實際的單執行緒還要慢,所以在 python 中計算密集型任務通常使用多程序,因為各個程序有各自獨立的gil,互不干擾。
而在io密集型任務中,cpu時常處於等待狀態,作業系統需要頻繁與外界環境進行互動,如讀寫檔案,在網路間通訊等。在這期間gil會被釋放,因而就可以使用真正的多執行緒。
上面都是理論,接下來實戰看看實際效果是否符合理論
"""多線awdprt程多程序模擬執行效率"""
from multiprocessing import pool
from threading import thread
import time, math
def simulation_io(a):
"""模擬io操作"""
time.sleep(3)
def simulation_compute(a):
"程式設計客棧""模擬計算密集型任務"""
for i in range(int(1e7)):
math.sin(40) + math.cos(40)
return
def normal_func(func):
"""普通方法執行效率"""
for i in range(6):
func(i)
return
def mp(func):
"""程序池中的map方法"""
with pool(processes=6) as p:
res = p.map(func, list(range(6)))
return
def asy(func):
"""程序池中的非同步執行"""
with pool(processes=6) as p:
result =
for j in range(6):
a = p.apply_async(func, args=(j, ))
result.append(a)
res = [j.get() for j in result]
def thread(func):
"""多執行緒方法"""
threads =
for j in range(6):
t =程式設計客棧 thread(target=func, args=(j, ))
threads.append(t)
t.start()
for t in threads:
t.join()
def showtime(f, func, name):
"""計算並展示函式的執行時間
:param f: 多程序和多執行緒的方法
:param func: 多程序和多執行緒方法中需要傳入的函式
:param name: 方法的名字
:return:
"""start_time = time.time()
f(func)
print(f" time: s")
def main(func):
"""執行程式的主函式
:param func: 傳入需要計算時間的函式名
"""showtime(normal_func, func, "normal")
print()
print("------ 多程序 ------")
showtime(mp, func, "map")
showtime(asy, func, "async")
print()
print("----- 多執行緒 -----")
showtime(thread, func, "thread")
if __name__ == "__main__":
print("------------ 計算密集型 ------------")
func = simulation_compute
main(func)
print()
print()
print()
print("------------ io 密集型 ------------")
func = simulation_io
main(func)
線性執行
多程序(map)
多程序(async)
多執行緒計算密集型
16.0284s
3.5236s
3.4367s
15.2142s
io密集型
18.0201s
3.0945s
3.0809s
3.0041s
從**中很明顯的可以看出:
所以,針對計算密集型任務使用多程序,針對io密集型任務使用多執行緒
多執行緒與多程序 執行效率
1 多執行緒在單核和多核cpu上的執行效率問題的討論 多執行緒在單cpu中其實也是順序執行的,不過系統可以幫你切換哪個執行而已,其實並沒有快 反而慢 多個 cpu的話就可以在多個 cpu中同時執行了。單核 cpu時使用多執行緒,通常是有執行緒要處於等待狀態。而對於普通的進度條更新類的,能夠簡單控制的...
Python 多執行緒與多程序
前言 以前玩單機或者玩小資料集,都基本不用多執行緒或多程序都能基本滿足需求了 所以沒怎麼了解這方面的東西。但現在玩幾百萬甚至上千萬的資料,甚至集群等東西之後,就有必要學習多執行緒或多程序了。在python中首先要匯入相關的模組 import threading as td import multip...
python 多執行緒與多程序
程序與執行緒的區別 程序 應用程式的執行例項,每乙個執行中的程式就是乙個程序 執行緒 程序的組成部分,乙個程序可以擁有多個執行緒 在多執行緒中,會有乙個主線程來完成整個程序從開始到結束的全部操作,而其他的執行緒會在主線程的執行過程中被建立或退出。python景區賣票系統 多執行緒的應用 import...