走入計算機的第三十八天(python的進程和協成))
一、進程
1、multiprocessing模塊實現多進程並發。
1.1multiprocessing包是Python中的多進程管理包,與threading.Thread類似,它可以利用multiprocessing.Process對象來創建一個進程 該進程可以運行在Python程序內部編寫的函數,屬於父進程和子進程的關系。該Process對象與Thread對象的用法相同,也有start(), run(), join()的方法。
1.2Process類的簡紹
構造方法:
Process([group [, target [, name [, args [, kwargs]]]]])
group: 線程組,目前還沒有實現,庫引用中提示必須是None;
target: 要執行的方法;
name: 進程名;
args/kwargs: 要傳入方法的參數。
實例方法:
is_alive():返回進程是否在運行。
join([timeout]):阻塞當前上下文環境的進程程,直到調用此方法的進程終止或到達指定的timeout(可選參數)。
start():進程準備就緒,等待CPU調度
run():strat()調用run方法,如果實例進程時未制定傳入target,這star執行t默認run()方法。
terminate():不管任務是否完成,立即停止工作進程
屬性:
daemon:和線程的setDeamon功能一樣
name:進程名字。
pid:進程號。
1.3、實例操作
2、進程間通信方法——進程隊列
2.1進程隊列queue,與線程隊列相似,如圖所示:
2.2管道(pipe),如圖所示:
註釋:Pipe()返回的兩個連接對象代表管道的兩端。 每個連接對象都有send()和recv()方法(等等)。 請註意,如果兩個進程 (或線程)嘗試同時讀取或寫入管道的同一端,管道中的數據可能會損壞。
2.3manager()進程之間數據共享,如圖所示:
註釋:父進程必須等到子進程執行完成後才能執行下一步。
Queue和pipe只是實現了數據交互,並沒實現數據共享,但是manager是一個進程去更改另一個進程的數據.
3、進程池
3.1什麽是進程池?
進程池內部維護一個進程序列,當使用時,則去進程池中獲取一個進程序列,如果進程池中沒有可供使用的進程序列,那麽程序就 會等待,直到進程池中有可用進程序列為止。
3.2如圖所示:
進程池中有以下幾個主要方法:
apply:從進程池裏取一個進程並執行
apply_async:apply的異步版本,一次性取完後再執行
terminate:立刻關閉線程池
close:等待所有進程結束後,才關閉線程池
join:主進程等待所有子進程執行完畢,必須在close或terminate之後
二、協成
1、什麽是協成?
協程,又稱微線程,纖程。英文名Coroutine,協程是一種用戶態的輕量級線程。
2、協成特點
協程擁有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器 上下文和棧。因此:協程能保留上一次調用時的狀態(即所有局部狀態的一個特定組合),每次過程重入時,就相當於進入上一次調用的狀 態,換種說法:進入上一次離開時所處邏輯流的位置。
3、yield與協成,如圖所示:
4、greenlet實現協成
greenlet機制的主要思想是:生成器函數或者協程函數中的yield語句掛起函數的執行,直到稍後使用next()或send()操作進行恢復為止。 可以使用一個調度器循環在一組生成器函數之間協作多個任務。greentlet是python中實現我們所謂的"Coroutine(協程)"的一個基礎庫.
5、gevent實現協成
註釋:同比之前上面兩個實現協成的方式而言,當gevent實現協成遇到IO操作時會切換到下一個任務中,大大的節省了cpu執行程序的 時間
註釋:
協程的好處:無需線程上下文切換的開銷,無需原子操作鎖定及同步的開銷;方便切換控制流,簡化編程模型;高並發+高擴展性+低成 本:一個CPU支持上萬的協程都不是問題。所以很適合用於高並發處理。
缺點:無法利用多核資源:協程的本質是個單線程,它不能同時將
單個CPU
的多個核用上,協程需要和進程配合才能運行在多CPU 上.當然我們日常所編寫的絕大部分應用都沒有這個必要,除非是cpu密集型應用。進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程序
走入計算機的第三十八天(python的進程和協成))