進程
什么是進程程序:例如xxx.py這是程序,是一個靜態(tài)的
進程:一個程序運行起來后,代碼+用到的資源 稱之為進程,它是操作系統(tǒng)分配資源的基本單元,不僅可以通過線程完成多任務,進程也是可以的
進程的狀態(tài)**
- 就緒態(tài):運行的條件都已經(jīng)慢去,正在等在cpu執(zhí)行
- 執(zhí)行態(tài):cpu正在執(zhí)行其功能
- 等待態(tài):等待某些條件滿足,例如一個程序sleep了,此時就處于等待態(tài)
進程的創(chuàng)建-multiprocessing
- Process參數(shù)如下:
target:如果傳遞了函數(shù)的引用,可以任務這個子進程就執(zhí)行這里的代碼
args:給target指定的函數(shù)傳遞的參數(shù),以元組的方式傳遞
kwargs:給target指定的函數(shù)傳遞命名參數(shù)
name:給進程設定一個名字,可以不設定
group:指定進程組,大多數(shù)情況下用不到
Process創(chuàng)建的實例對象的常用方法:
start():啟動子進程實例(創(chuàng)建子進程)
is_alive():判斷進程子進程是否還在活著
join([timeout]):是否等待子進程執(zhí)行結(jié)束,或等待多少秒
terminate():不管任務是否完成,立即終止子進程
Process創(chuàng)建的實例對象的常用屬性:
name:當前進程的別名,默認為Process-N,N為從1開始遞增的整數(shù)
pid:當前進程的pid(進程號)
進程中資源不共享
進程間通信-Queue
進程間通信-Queue:
Process之間有時需要通信,操作系統(tǒng)提供了很多機制來實現(xiàn)進程間的通信。
- Queue的使用 可以使用multiprocessing模塊的Queue實現(xiàn)多進程之間的數(shù)據(jù)傳遞,Queue本身是一個消息列隊程序,以下小實例來演示一下Queue的工作原理:
進程池的簡單使用
eg:
from concurrent.futures import ProcessPoolExecutor
import os , time
'''
def downlooad_data(page):
print(page,os.getpid())
time.sleep(1)
return '請求成功' + str(page), page
# 進程執(zhí)行完一個任務后的回調(diào)函數(shù)
def dowmload_done(futures):
result = futures.result()
print(result)
next_page = int(result[1]) + 1
handler = pool.submit(downlooad_data, next_page)
handler.add_done_callback(dowmload_done)
if __name__ == '__main__':
# 創(chuàng)建進程池
# max_workers : 設置進程池中的進程數(shù)量
pool = ProcessPoolExecutor(4)
for page in range(0,100):
# fn,執(zhí)行函數(shù)
# *args,傳遞的參數(shù)
# **kwargs
handler = pool.submit(downlooad_data, page)
回調(diào)看個人習慣是否需要
handler.add_done_callback(dowmload_done)
# cannot schedule
new futures after shutdown
# pool.shutdown()
'''
from multiprocessing import Pool
def downlooad_data(page):
print(page,os.getpid())
time.sleep(1)
return '請求成功' + str(page), page
def done(feture):
print(feture)
if __name__ == '__main__':
pool = Pool(4)
for page in range(0,200):
'''
pool.apply_async():異步非阻塞
pool.apply():同步的方式添加任務
func : 要執(zhí)行的方法
args=(): 給函數(shù)傳遞的參數(shù)
error_callback=None : 執(zhí)行錯誤的回調(diào)
'''
pool.apply_async(downlooad_data, args=(page,) ,callback=done)
pool.close()
pool.join()
進程、線程對比 功能
進程,能夠完成多任務,比如 在一臺電腦上能夠同時運行多個QQ
線程,能夠完成多任務,比如 一個QQ中的多個聊天窗口
定義的不同
進程是系統(tǒng)進行資源分配基本單位.
線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運 行的基本單位.
線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享所在進程所擁有的全部資源
區(qū)別
一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小于進程(資源比進程少),使得多線程程序的并發(fā)性高。
進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率
線線程不能夠獨立執(zhí)行,必須依存在進程中
優(yōu)缺點
線程和進程在使用上各有優(yōu)缺點:線程執(zhí)行開銷小,但不利于資源的管理和保護;而進程正相反。
使用場景:
多進程常用來處理計算密集型任務: 計算密集型任務的特點:是要進行大量的計算,消耗CPU資源,比如計算圓周率、對視頻進行高清解碼等等,全靠CPU的運算能力。計算密集型任務可以用多任務完成,但是任務越多,花在任務切換的時間就越多,CPU執(zhí)行任務的效率就越低,所以,要最高效地利用CPU,計算密集型任務同時進行的數(shù)量應當?shù)扔贑PU的核心數(shù)。
多線程常用來處理IO密集型任務: IO密集型:涉及到網(wǎng)絡、磁盤IO的任務都是IO密集型任務,特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低于CPU和內(nèi)存的速度)。但是也要切記,在執(zhí)行多任務時,并不是越多線程越好。