python3多进程写时拷贝_Python实现多进程的详解(附示例)
本篇文章給大家帶來的內容是關于Python實現多進程的詳解(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
fork函數創建子進程
基本使用
Linux 操作系統提供了一個 fork函數用來創建子進程。fork()位于Python的os模塊中。
使用導入os模塊即可。
import os os.fork()
每次調用fork()函數后,相應的父進程都會生成一個子進程。
例如下面這段代碼:
import os os.fork() os.fork() os.fork()
執行之后將會生成8個進程。
fork()函數的返回值
fork()函數對于子進程的返回值永遠是0,而對父進程的返回值則為子進程的pid(進程號)。
實例
#!/usr/bin/env python import os import time rt = os.fork() if rt == 0: print(f"The child process is {os.getpid()} . His father is {os.getppid()}") # os.getpid()獲取當前進程進程號,os.getppid()獲取當前進程的父進程號 time.sleep(5) else: print(f"The father process is {os.getpid()} . His father is {os.getppid()}") time.sleep(5) print(f"Now the process is {os.getpid()} . His father is {os.getppid()}")
執行結果:
進程模塊
導入模塊
Python也提供了multiprocessing庫給全平臺提供了多線程編程。
import multiprocessing
簡單進程
下面代碼為一個簡單進程:
from multiprocessing import Process def work(num): for i in range(10): num += 1 print(num) return 0 def main(): num = 1 p1 = Process(target = work, args = (num,)) p1.start() if __name__ == '__main__': main()
這里從multiprocessing庫引入Process這個類。
p1 = Process(target = work, args = (num,))是創建一個進程。target為所要執行任務的函數,args則為接收的參數,必須以元組形式給與。
start()是讓進程開始運行。
同時進程有一些方法:
join方法
Process的join方法與多線程類似。為等待進程運行結束。
使用方法:join(timeout)。
使用join(),程序會等待進程結束后再繼續進行下面的代碼。
如果加入了timeout參數,則程序會等待timeout秒后繼續執行下面的程序。
close方法
close()用于關閉進程,但是不能關閉正在運行中的子進程。
進程類
可以通過創建類的方式實現多進程:
from multiprocessing import Process import time class My_Process(Process): def __init__(self,num): Process.__init__(self) self.num = num def run(self): time.sleep(2) print(self.num) def main(): for i in range(10): p = My_Process(i) p.start() if __name__ == '__main__': main()
進程池
from multiprocessing import Pool import time def target(num): time.sleep(2) print(num) def main(): pool = Pool(3) for i in range(3): pool.apply_async(target,(i,)) pool.close() pool.join() print('Finish!!!') if __name__ == '__main__': main()
對Pool對象調用join()方法會等待所有子進程執行完畢,調用join()之前必須先調用close(),調用close()之后就不能繼續添加新的Process了。
Pool(num)里的num為要添加到里面的進程數。不指定進程數,則默認為CPU核心數量。
進程間相互獨立
多進程的每一個進程都有一份變量的拷貝,進程之間的操作互不影響。
import multiprocessing import time zero = 0 def change_zero(): global zero for i in range(3): zero = zero + 1 print(multiprocessing.current_process().name, zero) if __name__ == '__main__': p1 = multiprocessing.Process(target = change_zero) p2 = multiprocessing.Process(target = change_zero) p1.start() p2.start() p1.join() p2.join() print(zero)
最后的執行結果:
如果進行文件IO操作,則多進程都會寫入同一個文件中。
隊列
使用multiprocessing里的Queue可使不同進程訪問相同的資源。
from multiprocessing import Process, Queue def addone(q): q.put(1) def addtwo(q): q.put(2) if __name__ == '__main__': q = Queue() p1 = Process(target=addone, args = (q, )) p2 = Process(target=addtwo, args = (q, )) p1.start() p2.start() p1.join() p2.join() print(q.get()) print(q.get())
閱讀全文
0 個人已贊贊一個收藏 (0)打賞
您入群打賞務必備注QQ號
支付寶掃一掃贊助
微信錢包掃描贊助
分享到:
生成海報
評論 搶沙發
評論前必須登錄!
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的python3多进程写时拷贝_Python实现多进程的详解(附示例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python decorator ssh
- 下一篇: wifi协议栈_一文读懂米家部分智能硬件