Python多執行緒與多程序程式設計(二) 就這麼簡單
"""
<axiner>宣告:
(錯了另刂扌丁我)
(如若有誤,請記得指出喲,謝謝了!!!)
"""
多程序程式設計>>>見上篇
什麼時候用多程序程式設計?
由於 GIL鎖,多執行緒無法充分多核優勢。即在耗cpu時,多執行緒無法去並行.....
耗cpu的操作時,用多程序程式設計。如:計算,演算法,圖形處理...
耗io的操作時,用多執行緒程式設計(程序切換代價要高於執行緒)。如:爬蟲時的等待.....
python os.fork()可以建立子程序(linux下)
eg:
import os
import time
pid = os.fork()
if pid == 0:
print("子程序為:{0}, 父程序為:{1}".format(os.getpid(),os.getppid()))
else:
print("父程序:{0}".format(pid))
time.sleep(5) # 可讓子程序隨父程序退出而kill掉,不然父程序先退出了子程序就不自動kill
說明:
此程式碼會執行父執行緒後,再執行子程序(從`pid = os.fork()`後執行)
(即會將`pid = os.fork()`後的所有程式碼及其資料全部拷貝到子程序中)
------------
多程序間通訊:
注:程序間的資料完全隔離的。
因此,
在多執行緒中的`共享全域性變數`與`執行緒中的Queue`不再適用於多程序
1\\ 程序Queue
# 建立一個共享的佇列(其實並不是共享的,實際是克隆的,內部維護著資料的共享),多個程序可以向佇列裡存/取資料
from multiprocessing import Queue
queue = Queue(7)
2\\ Pipe
# 程序間的管道內部機制通過啟動socket連線來維護兩個程序間的通訊
from multiprocessing import Pipe
son,father=Pipe() # 例項化管道,生成socket連線,一個客戶端一個服務端
3\\ Manager
# Manager實現了多個程序間的資料共享
支援的資料型別有 list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array
from multiprocessing import Manager # 其例項下的方法`Queue`
queue = Manager().Queue(7)
# 及其他資料型別
注: Python中有2個Queue, 不,應該說有3個
1\\ from queue import Queue
queue = Queue(3) # 普通Queue, 可用於多執行緒
2\\ from multiprocessing import Queue
queue = Queue(3) # 程序Queue, 可用於多程序(不可用於程序池)
3\\ from multiprocessing import Manager
queue = Manager().Queue(3) # 程序Queue, 可用於多程序,也可用於程序池
多程序與多執行緒程式碼編寫很類似(注: win下不能直接執行多程序,要放於`if __name__ == "__main__":`下執行)
程序池有兩種方式:
1\\ from multiprocessing import Pool
2\\ from concurrent.futures import ProcessPoolExecutor # 底層也是用`multiprocessing.Pool`實現的