進程(process)
進程是載入記憶體且將執行的程式
打開工作管理員
裡面的東西就是進程
每個進程會被分配一個獨立id(pid)
簡單來講 電腦執行一項任務就是一個進程
多進程(mutiprocessing)
假設我們需要同時完成多個任務
這時候可以使用多進程
多進程也就是說主進程外再建立子進程
並且把主進程的東西整份copy過去子進程
unix中 python可以使用fork()建立子進程
fork()會把主進程的東西複製到子進程
並回傳pid到主進程與子進程
主進程會拿到子進程的pid
子進程會拿到0
假設子進程需要主進程的pid
可以使用get.ppid()
windows並沒有fork指令
我看文檔 windows只能用spawn
spawn與fork差別我沒看很懂
大致上就fork比較快但比較不安全
spawn比較慢但比較安全
反正windows也用不到spawn以外兩種 先這樣:)))
有興趣可以看下面網站
總之 我們使用multiprocessing
我直接copy py文檔的code:
from multiprocessing import Process
import os
def info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid())
def f(name):
info('function f')
print('hello', name)
if __name__ == '__main__':
info('main line')
p = Process(target=f, args=('bob',))
p.start()
p.join()
輸出:
main line
module name: __main__
parent process: 1280
process id: 24780
function f
module name: __mp_main__
parent process: 24780
process id: 3672
hello bob
首先 程式執行主進程
之後程式執行子進程
這邊使用process這個類完成任務
target是目標函數 args是傳入目標函數的參數
p.start()是啟動子進程
p.join()是等待子進程結束才會往下運行
假設一次要設置多個進程
我們可以使用pool 一樣使用文檔code:
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3,4,5,6]))
這邊我有修改一下 我在list裡面多加幾個元素
這程式是pool池開五個進程
然後子進程去處理下面的程式
我們這邊只開五個進程 但裡面有6個元素
所以6必須等到有個進程被釋出 此元素才會被處理
一般來說 pool開的大小 == cpu核數
等等再寫進程間溝通跟鎖 先這樣
參考資料:
https://stackoverflow.com/questions/64095876/multiprocessing-fork-vs-spawn
https://docs.python.org/zh-cn/3.12/library/multiprocessing.html