一、線程替代方案
1.subprocess
(1)完全跳過線程,使用進程
(2)是派生進程的主要替代方案
(3)python2.4后引入
2.multiprocessing
(1)使用threading接口派生,使用子進程
(2)允許為多核或者多CPU派生進程,接口很threading非常相似
(3)python2.6
3.concurrent.futures
(1)新的異步執行模塊
(2)人物級別的操作
(3)python3.2之后引入
4.多進程
(1)進程間通訊(InterprocessCommunication,IPC)
(2)進程之間無任何共享狀態
(3)進程的創建
i.直接生成Process實例對象,舉例
import multiprocessing from time import sleep,ctime def clock(interval): while True: print("The time is %s" % ctime()) sleep(interval) if __name__ == "__main__": p = multiprocessing.Process(target= clock,args=(2,)) p.start() #從運行就可以看出來主進程已經結束了,但是子線程仍然在運行着 #和我們之前講的線程,有一個最大區別就是線程在主進程里面,主進程結束了,子線程就結束了 #子線程從屬於進程,子進程與進程之間是並列關系 #這里的程序停止,是我手動停止的

ii.派生子類
舉例:重寫子類,和我們之前講的線程的差不多,這里民重寫了最重要的兩個函數,一個是初始化子類,繼承父類的初始化,第二個就是運行函數
class ClockProcess(multiprocessing.Process): def __init__(self,interval): super().__init__() self.interval = interval def run(self): while True: print("The time is {0}".format(ctime())) sleep(self.interval) if __name__ == "__main__": p2 = ClockProcess(2) p2.start()

iii.在os中查看pid,ppid以及他們的關系
def info(title): print(title) print("module name:",__name__) #得到父進程的id print("parent process:",os.getppid()) #得到本身進程的id print("process id:",os.getpid()) def f(name): info("function f") print("hello",name) if __name__ == "__main__": info("main line") print("==================================") p = multiprocessing.Process(target=f,args=("bob",)) p.start() p.join()
解釋:先調用了一個函數,然后又調用了一個嵌套函數的函數

四、源碼
d26_1_multiprocess_exercise.py
https://github.com/ruigege66/Python_learning/blob/master/d26_1_multiprocess_exercise.py
2.CSDN:https://blog.csdn.net/weixin_44630050(心悅君兮君不知-睿)
3.博客園:https://www.cnblogs.com/ruigege0000/
4.歡迎關注微信公眾號:傅里葉變換,個人公眾號,僅用於學習交流,后台回復”禮包“,獲取大數據學習資料

