執行緒和程式區分
程式是資源分配的單位,執行緒是資源排程的單位 當一個程式執行起來,作業系統會分配一系列資源給這個程式去使用,這些資源稱為程式 在程式執行必須由執行緒來完成
在一個程式中,一定會有至少一個執行緒在執行
- 主程式結束,其他子程式依舊執行
- 主執行緒結束,其他子執行緒也一起結束
實現多工的方式
- 多執行緒 在一個程式中建立多個執行緒來執行任務,缺點:多執行緒之間可以共享資料,但容易造成資源競爭問題(執行緒安全問題)
- 多程式 建立多個程式來完成任務,缺點:程式佔用的資源過多,各個程式的資源時相對獨立
建立程式的方式
def task():
"""任務函式"""
def main():
p = multiprocessing.Process(target=task,args=(10,),kwargs={})
p.start() # 建立子程式,並啟動起來
p.join() # 阻塞當前程式,等待p的程式結束後再向下執行
if __name__ == "__main__":
main()
複製程式碼
def task():
"""任務函式"""
def main():
po = Pool(3) # 定義一個程式池,最大程式數3
for i in range(0, 1000):
po.apply_async(func=task, args=(10,))
po.close() # 關閉程式池,不在接受新的任務
# 必須加上,否則主程式結束,程式池的程式也會結束
po.join() # 讓主程式阻塞,等待程式池中所有任務結束
if __name__ == "__main__":
main()
複製程式碼
程式池的優點
- 降低資源消耗。通過重複利用已建立的程式降低程式建立和銷燬造成的消耗。
- 提高響應速度。當任務到達時,任務可以不需要等到程式建立就能立即執行。
- 提高程式的可管理性。程式是稀缺資源,如果無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,使用程式池可以進行統一的分配,調優和監控
Queue使用方法:
- Queue.qsize():返回當前佇列包含的訊息數量;
- Queue.empty():如果佇列為空,返回True,反之False ;
- Queue.full():如果佇列滿了,返回True,反之False;
- Queue.get():獲取佇列中的一條訊息,然後將其從列隊中移除,可傳參超時時長。
- Queue.get_nowait():相當Queue.get(False),取不到值時觸發異常:Empty;
- Queue.put():將一個值新增進數列,可傳參超時時長。
- Queue.put_nowait():相當於Queue.put(item,False),當佇列滿了時報錯:Full。