py

看板Marginalman作者 (溫水佳樹的兄長大人)時間1年前 (2024/09/25 14:23), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串6/16 (看更多)
進程(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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.119.233.6 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1727245389.A.4AD.html
文章代碼(AID): #1cywnDIj (Marginalman)
討論串 (同標題文章)
以下文章回應了本文
1
7
完整討論串 (本文為第 6 之 16 篇):
1
5
9月前, 03/09
2
3
1年前, 11/16
0
3
1年前, 11/12
2
2
1年前, 10/02
6
13
1
1
1年前, 09/28
1
1
2
6
0
6
1年前, 09/26
1
7
文章代碼(AID): #1cywnDIj (Marginalman)