python3多进程写时拷贝_Python实现多进程的详解(附示例)
本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于Python實(shí)現(xiàn)多進(jìn)程的詳解(附示例),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。
fork函數(shù)創(chuàng)建子進(jìn)程
基本使用
Linux 操作系統(tǒng)提供了一個(gè) fork函數(shù)用來(lái)創(chuàng)建子進(jìn)程。fork()位于Python的os模塊中。
使用導(dǎo)入os模塊即可。
import os os.fork()
每次調(diào)用fork()函數(shù)后,相應(yīng)的父進(jìn)程都會(huì)生成一個(gè)子進(jìn)程。
例如下面這段代碼:
import os os.fork() os.fork() os.fork()
執(zhí)行之后將會(huì)生成8個(gè)進(jìn)程。
fork()函數(shù)的返回值
fork()函數(shù)對(duì)于子進(jìn)程的返回值永遠(yuǎn)是0,而對(duì)父進(jìn)程的返回值則為子進(jìn)程的pid(進(jìn)程號(hào))。
實(shí)例
#!/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()獲取當(dāng)前進(jìn)程進(jìn)程號(hào),os.getppid()獲取當(dāng)前進(jìn)程的父進(jìn)程號(hào) 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()}")
執(zhí)行結(jié)果:
進(jìn)程模塊
導(dǎo)入模塊
Python也提供了multiprocessing庫(kù)給全平臺(tái)提供了多線程編程。
import multiprocessing
簡(jiǎn)單進(jìn)程
下面代碼為一個(gè)簡(jiǎn)單進(jìn)程:
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庫(kù)引入Process這個(gè)類。
p1 = Process(target = work, args = (num,))是創(chuàng)建一個(gè)進(jìn)程。target為所要執(zhí)行任務(wù)的函數(shù),args則為接收的參數(shù),必須以元組形式給與。
start()是讓進(jìn)程開(kāi)始運(yùn)行。
同時(shí)進(jìn)程有一些方法:
join方法
Process的join方法與多線程類似。為等待進(jìn)程運(yùn)行結(jié)束。
使用方法:join(timeout)。
使用join(),程序會(huì)等待進(jìn)程結(jié)束后再繼續(xù)進(jìn)行下面的代碼。
如果加入了timeout參數(shù),則程序會(huì)等待timeout秒后繼續(xù)執(zhí)行下面的程序。
close方法
close()用于關(guān)閉進(jìn)程,但是不能關(guān)閉正在運(yùn)行中的子進(jìn)程。
進(jìn)程類
可以通過(guò)創(chuàng)建類的方式實(shí)現(xiàn)多進(jìn)程:
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()
進(jìn)程池
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()
對(duì)Pool對(duì)象調(diào)用join()方法會(huì)等待所有子進(jìn)程執(zhí)行完畢,調(diào)用join()之前必須先調(diào)用close(),調(diào)用close()之后就不能繼續(xù)添加新的Process了。
Pool(num)里的num為要添加到里面的進(jìn)程數(shù)。不指定進(jìn)程數(shù),則默認(rèn)為CPU核心數(shù)量。
進(jìn)程間相互獨(dú)立
多進(jìn)程的每一個(gè)進(jìn)程都有一份變量的拷貝,進(jìn)程之間的操作互不影響。
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)
最后的執(zhí)行結(jié)果:
如果進(jìn)行文件IO操作,則多進(jìn)程都會(huì)寫入同一個(gè)文件中。
隊(duì)列
使用multiprocessing里的Queue可使不同進(jìn)程訪問(wèn)相同的資源。
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 個(gè)人已贊贊一個(gè)收藏 (0)打賞
您入群打賞務(wù)必備注QQ號(hào)
支付寶掃一掃贊助
微信錢包掃描贊助
分享到:
生成海報(bào)
評(píng)論 搶沙發(fā)
評(píng)論前必須登錄!
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的python3多进程写时拷贝_Python实现多进程的详解(附示例)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python decorator ssh
- 下一篇: wifi协议栈_一文读懂米家部分智能硬件