python---多工程式

☞☜123♝發表於2019-01-02

執行緒和程式區分

程式是資源分配的單位,執行緒是資源排程的單位 當一個程式執行起來,作業系統會分配一系列資源給這個程式去使用,這些資源稱為程式 在程式執行必須由執行緒來完成

在一個程式中,一定會有至少一個執行緒在執行

  1. 主程式結束,其他子程式依舊執行
  2. 主執行緒結束,其他子執行緒也一起結束

實現多工的方式

  1. 多執行緒 在一個程式中建立多個執行緒來執行任務,缺點:多執行緒之間可以共享資料,但容易造成資源競爭問題(執行緒安全問題)
  2. 多程式 建立多個程式來完成任務,缺點:程式佔用的資源過多,各個程式的資源時相對獨立

建立程式的方式

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()
複製程式碼

程式池的優點

  1. 降低資源消耗。通過重複利用已建立的程式降低程式建立和銷燬造成的消耗。
  2. 提高響應速度。當任務到達時,任務可以不需要等到程式建立就能立即執行。
  3. 提高程式的可管理性。程式是稀缺資源,如果無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,使用程式池可以進行統一的分配,調優和監控

Queue使用方法:

  1. Queue.qsize():返回當前佇列包含的訊息數量;
  2. Queue.empty():如果佇列為空,返回True,反之False ;
  3. Queue.full():如果佇列滿了,返回True,反之False;
  4. Queue.get():獲取佇列中的一條訊息,然後將其從列隊中移除,可傳參超時時長。
  5. Queue.get_nowait():相當Queue.get(False),取不到值時觸發異常:Empty;
  6. Queue.put():將一個值新增進數列,可傳參超時時長。
  7. Queue.put_nowait():相當於Queue.put(item,False),當佇列滿了時報錯:Full。

相關文章