由於cpython實現中的gil的限制,python中的多執行緒其實並不是真正的多執行緒,如果想要充分地使用多核cpu的資源,在python中大部分情況我們需要使用多程序。 這也許就是python中多程序類庫如此簡潔好用的原因所在。在python中可以向多執行緒一樣簡單地使用多程序。
一、多程序
process的成員變數和方法:
>>class multiprocessing.process([group[, target[, name[, args[, kwargs]]]]]) 來的定義類似於threading.thread。target表示此程序執行的函式,args和kwargs表示target的引數。
>>name, pid
分別表示程序的名字,程序id。
>> daemon成員
daemon標誌位bool變數,需要在start()呼叫前設定。daemon的初始值是從父程序繼承而來。當乙個程序結束的時候,它嘗試去結束它的所有的daemon子程序。
注意:daemon程序不允許建立子程序。否則當daemon程序結束的時候它的子程序不能被結束。
這裡的daemon不是unix的daemon程序,當父程序結束的時候所有的daemon子程序也將被終止(對於非daemon程序,父程序不等待非daemon的紫子程序,除非顯示地對非daemon子程序使用join()方法)。
>> exitcode
如果程序還沒有退出,則為none,如果正確的退出則為0,如果有錯誤則為》0的錯誤**,如果程序為終止則為-1*singal。
>> start(), is_live(), terminate()
start()用來啟動程序,is_live()用來檢視程序的狀態,terminate()用來終止程序。
>> run()
可以在process的子類中過載run()方法,從而設定程序的任務。過載process是構造新程序的另一種方式,一定程度上上等價於process的target引數。
multiprcessing的靜態方法:
>> multiprocessing.cpu_count()
用來獲得當前的cpu的核數,可以用來設定接下來子程序的個數。
>> multiprocessing.active_children()
用來獲得當前所有的子程序,包括daemon和非daemon子程序。
例項:import multiprocessing
import time
import sys
def worker(num):
p = multiprocessing.current_process()
print ('starting:' + p.name + ":" + str(p.pid))
print(str(num))
sys.stdout.flush()
print ('exiting :' + p.name + ":" + str(p.pid))
sys.stdout.flush()
def daemon():
p = multiprocessing.current_process()
print ('starting:' + p.name + ":" + str(p.pid))
sys.stdout.flush()
time.sleep(10)
print ('exiting :' + p.name + ":" + str(p.pid))
sys.stdout.flush()
def non_daemon():
p = multiprocessing.current_process()
print ('starting:' + p.name + ":" + str(p.pid))
sys.stdout.flush()
time.sleep(20)
print ('exiting :' + p.name + ":" + str(p.pid))
sys.stdout.flush()
if __name__ == '__main__':
w = multiprocessing.process(name='worker', target=worker, args=(100,))
d = multiprocessing.process(name='daemon', target=daemon)
d.daemon = true
nd = multiprocessing.process(name='non-daemon', target=non_daemon)
w.start()
d.start()
nd.start()
print("the number of cpu is " + str(multiprocessing.cpu_count()))
print("all children processes:")
for p in multiprocessing.active_children():
print("child:" + p.name + ":" + str(p.pid))
print()
w.join()
#d.join()
執行結果:
可以從上面的例子看到沒有多非daemon子程序使用join()方法,結果父程序沒有等待非daemon程序結束就退出了。
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 3.6 環境下測試通過。多程序 multiprocessing 模組是在 python 2.6 版本中加入的,和多執行緒 threading 模組類似,都是用來做並行運算的。不過python既然有了threading,為什麼還要搞乙個multiprocessing呢?這是因為...