1. 程式人生 > >Python多執行緒與多程序程式設計(二) 就這麼簡單

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`實現的