python程序默認(rèn)單核線性執(zhí)行程序婆誓,為更高效利用計(jì)算機(jī)的多核吃环、多線程能力,python搭建了多線程洋幻、多進(jìn)程的機(jī)制郁轻,更高效的完成程序。多線程模塊threading、多進(jìn)程模塊multiprocess好唯、池化模塊concurrent.future
Corey Schafer : Python Threading Tutorial: Run Code Concurrently Using the Threading Module
莫煩Python : Multiprocessing 讓你的多核計(jì)算機(jī)發(fā)揮真正潛力 Python
菜鳥(niǎo)教程 Python3多線程
知乎 :python中multiprocess的參數(shù)共享與傳遞
threading模塊竭沫、多線程,主要針對(duì)I/O更高的任務(wù)(輸入/輸出文件骑篙、圖像等蜕提,上傳/下載任務(wù)等)
import threading
import time
start = time.perf_counter()
def do_something():
print(f'Sleeping 1 second...')
time.sleep(1)
print(f'Done sleeping...')
# 線性執(zhí)行兩個(gè)命令
# do_something()
# do_something()
# 雙線程執(zhí)行
# t1 = threading.Thread(target=do_something)
# t2 = threading.Thread(target=do_something)
# t1.start()
# t2.start()
# t1.join()
# t2.join()
# 更好的多線程操作
threads = []
for _ in range(10):
t = threading.Thread(target=do_something)
t.start()
threads.append(t)
for thread in threads:
thread.join()
finish = time.perf_counter()
print(f"finish in {round(finish - start,2)} second(s)")
########################################################
#結(jié)果
(base) ? Corey_Schafer python sp_demo.py
Sleeping 1 second...
Sleeping 1 second...
Sleeping 1 second...
Sleeping 1 second...
Sleeping 1 second...
Sleeping 1 second...
Sleeping 1 second...
Sleeping 1 second...
Sleeping 1 second...
Sleeping 1 second...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
Done sleeping...
finish in 1.01 second(s)
multiprocess 多進(jìn)程,主要針對(duì)CPU計(jì)算任務(wù)替蛉,比如圖像壓縮贯溅,數(shù)值計(jì)算等
import multiprocessing
import time
start = time.perf_counter()
def do_something(secs):
print(f'Sleeping {secs} second...\n')
time.sleep(secs)
print(f'Done sleeping...{secs}')
# do_something()
# do_something()
# finish = time.perf_counter()
# print(f"finish in {round(finish - start,2)} second(s)")
if __name__ == '__main__':
processes = []
for _ in range(4):
p = multiprocessing.Process(target=do_something,args=[1.5])
p.start()
processes.append(p)
for process in processes:
process.join()
finish = time.perf_counter()
print(f"finish in {round(finish - start,2)} second(s)")
########################################################
(base) ? Corey_Schafer python sp_demo.py
Sleeping 1.5 second...
Sleeping 1.5 second...
Sleeping 1.5 second...
Sleeping 1.5 second...
Done sleeping...1.5
Done sleeping...1.5
Done sleeping...1.5
Done sleeping...1.5
finish in 1.62 second(s)
concurrent.futures 模塊的池化操作,自動(dòng)利用計(jì)算機(jī)的核躲查,自動(dòng)分配任務(wù)
import concurrent.futures
import time
start = time.perf_counter()
def do_something(secs):
print(f'Sleeping {secs} second...\n')
time.sleep(secs)
return f'Done sleeping...{secs}'
if __name__ == '__main__':
with concurrent.futures.ProcessPoolExecutor() as executor:
secs = [4,3,2,1]
results = executor.map(do_something,secs)
for result in results:
print(result)
注意??
執(zhí)行必須在 if name == 'main': 框架下操作它浅,python=3.7版本以下,不需要镣煮;3.8版本之后必須要指定if name == 'main':至于為什么用姐霍,解釋如下:
程序中常見(jiàn)的語(yǔ)句if name =='main': ,這段代碼的含義是當(dāng)該程序做為主程序啟動(dòng)時(shí)典唇,執(zhí)行下面的代碼镊折。對(duì)于multiprocessing的程序來(lái)說(shuō),這段代碼是必不可少的介衔,因?yàn)樗峁┝酥鬟M(jìn)程入口恨胚,并通過(guò)主程序來(lái)啟動(dòng)子程序。如果沒(méi)有這段代碼炎咖,python無(wú)法明確判斷那個(gè)是主進(jìn)程赃泡,這樣就無(wú)法分配子進(jìn)程。