本文**在 python 3.6 環境下測試通過。多程序(multiprocessing)模組是在 python 2.6 版本中加入的,和多執行緒(threading)模組類似,都是用來做並行運算的。不過python既然有了threading,為什麼還要搞乙個multiprocessing呢?這是因為python內部有乙個全域性解釋鎖(gil),任何乙個程序任何時候只允許乙個執行緒進行cpu運算,如果乙個程序中的某個執行緒在進行cpu運算時獲得gil,其他執行緒將無法進行cpu運算只能等待,使得多執行緒無法利用cpu多核的特性。多程序處理實際上對每個任務都會生成乙個作業系統的程序,並且每乙個程序都被單獨賦予了python的直譯器和gil,所以程式在執行中有多個gil存在,每個執行者的執行緒都會拿到乙個gil,在不同的環境下執行,自然也可以被分配到不同的處理器上。
multiprocessing模組提供了乙個process類可以建立程序物件。建立程序有兩種方式,第一種通過process類直接建立,引數target指定子程序要執行的程式。第二種通過繼承process類來實現。
我們先用第一種方式建立子程序,子程序會將傳遞給它的引數擴大一倍,**如下:
#-*- coding:utf8 -*-
第二種方式通過繼承process類,並重寫run方法:
class
multiprocessing模組和threading模組一樣也支援鎖。通過acquire獲取鎖,執行操作後通過release釋放鎖。
#-*- coding:utf8 -*-
pool類表示工作程序的池子,它可以提供指定數量的程序供使用者呼叫,當有請求提交到程序池時,如果程序池有空閒程序或程序數還沒到達指定上限,就會分配乙個程序響應請求,否則請求只能等待。pool類主要在執行目標多且需要控制程序數量的情況下使用,如果目標少且不用控制程序數量可以使用process類。
#-*- coding:utf8 -*-
map只能向處理函式傳遞乙個引數。
#-*- coding:utf8 -*-
程序間通訊的方式一般有管道(pipe)、訊號(signal)、訊息佇列(message)、訊號量(semaphore)、共享記憶體(shared memory)、套接字(socket)等。這裡我們著重講一下在python多程序程式設計中常用的程序方式multiprocessing.pipe函式和multiprocessing.queue類。
multiprocessing.pipe()即管道模式,呼叫pipe()方法返回管道的兩端的connection。pipe方法返回(conn1, conn2)代表乙個管道的兩個端。pipe方法有duplex引數,如果duplex引數為true(預設值),那麼這個管道是全雙工模式,也就是說conn1和conn2均可收發;duplex為false,conn1只負責接受訊息,conn2只負責傳送訊息。send()和recv()方法分別是傳送和接受訊息的方法。乙個程序從pipe某一端輸入物件,然後被pipe另一端的程序接收,單向管道只允許管道一端的程序輸入另一端的程序接收,不可以反向通訊;而雙向管道則允許從兩端輸入和從兩端接收。
#-*- coding:utf8 -*-
在父程序中建立兩個子程序,乙個往queue裡寫資料,乙個從queue裡讀資料:
#-*- coding:utf8 -*-
pipe的讀寫效率要高於queue。那麼我們如何的選擇它們呢? 如果你的環境是多生產者和消費者,那麼你只能是選擇queue佇列。 如果兩個程序間處理的邏輯簡單,但是就是要求絕對的速度,那麼pipe是個好選擇。 python多程序 python多程序
當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...
python多程序 Python多程序實踐
建立程序方式如下 可以通過lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。使用方式 構造 類方法 使用方式 構造 更多型別支援一般使用manager,支援的型別包括list,dict,namespace,lock,rlock,semaphore,boundedsemap...
python多程序優化 Python 多程序處理
嘗試學習python的多程序模組,對比多執行緒,大概的區別在 1.多程序的處理速度更快 2.多程序的各個子程序之間交換資料很不方便 多程序呼叫方式 程序基本使用multicore 程序池優化程序的呼叫multicore pool 在使用程序池的時候,運許函式有return,而基本用法中程序是接收不了...