7.2.2 - 并发多线程 开启进程的两种方式
生活随笔
收集整理的這篇文章主要介紹了
7.2.2 - 并发多线程 开启进程的两种方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一 multiprocessing模塊介紹
python中的多線程無法利用多核優勢,如果想要充分地使用多核CPU的資源(os.cpu\_count\(\)查看),在python中大部分情況需要使用多進程。
Python提供了multiprocessing。 multiprocessing模塊用來開啟子進程,并在子進程中執行我們定制的任務(比如函數),該模塊與多線程模塊threading的編程接口類似。multiprocessing模塊的功能眾多:支持子進程、通信和共享數據、執行不同形式的同步,>提供了Process、Queue、Pipe、Lock等組件。
需要再次強調的一點是:與線程不同,進程沒有任何共享狀態,進程修改的數據,改動僅限于該進程內。
二 Process類的介紹
創建進程的類:
Process([group [, target [, name [, args [, kwargs]]]]]),由該類實例化得到的對象,可用來開啟一個子進程 強調: 1. 需要使用關鍵字的方式來指定參數 2. args指定的為傳給target函數的位置參數,是一個元組形式,必須有逗號參數介紹:
group參數未使用,值始終為None target表示調用對象,即子進程要執行的任務 args表示調用對象的位置參數元組,args=(1,2,'cmz',) kwargs表示調用對象的字典,kwargs={'name':'cmz','age':18} name為子進程的名稱?
方法介紹:
p.start():啟動進程,并調用該子進程中的p.run() p.run():進程啟動時運行的方法,正是它去調用target指定的函數,我們自定義類的類中一定要實現該方法 p.terminate():強制終止進程p,不會進行任何清理操作,如果p創建了子進程,該子進程就成了僵尸進程,使用該方法需要特別小心這種情況。如果p還保存了一個鎖那么也將不會被釋放,進而導致死鎖 p.is_alive():如果p仍然運行,返回Truep.join([timeout]):主線程等待p終止(強調:是主線程處于等的狀態,而p是處于運行的狀態)。timeout是可選的超時時間。?
屬性介紹:
p.daemon:默認值為False,如果設為True,代表p為后臺運行的守護進程,當p的父進程終止時,p也隨之終止,并且設定為True后,p不能創建自己的新進程,必須在p.start()之前設置 p.name:進程的名稱 p.pid:進程的pid?
三 Process類的使用
注意:在windows中Process()必須放到# if __name__ == '__main__':下
創建并開啟子進程的方式一
import time import random from multiprocessing import Processdef running(name):print('%s runninging' %name)time.sleep(random.randrange(1,5))print('%s running end' %name)if __name__ == '__main__':#實例化得到四個對象p1=Process(target=running,args=('cmz1',)) #必須加,號p2=Process(target=running,args=('cmz2',))p3=Process(target=running,args=('cmz3',))p4=Process(target=running,args=('cmz4',))#調用對象下的方法,開啟四個進程 p1.start()p2.start()p3.start()p4.start()print('主')創建并開啟子進程的方式二
import time import random from multiprocessing import Processclass running(Process):def __init__(self,name):super().__init__()self.name=namedef run(self):print('%s running' %self.name)time.sleep(random.randrange(1,5))print('%s running end' %self.name)if __name__ == '__main__':#實例化得到四個對象p1=running('cmz1')p2=running('cmz2')p3=running('cmz3')p4=running('cmz4')#調用對象下的方法,開啟四個進程p1.start() #start會自動調用run p2.start()p3.start()p4.start()print('主')練習
from multiprocessing import Processn=100 #在windows系統中應該把全局變量定義在if __name__ == '__main__'之上就可以了def work():global nn=0print('子進程內: ',n)if __name__ == '__main__':p=Process(target=work)p.start()print('主進程內: ',n)結果是(子進程在開始的時候拷貝了父進程的數據,然后自己又修改了數據。)
主進程內: 100 子進程內: 0?
轉載于:https://www.cnblogs.com/caimengzhi/p/8511406.html
總結
以上是生活随笔為你收集整理的7.2.2 - 并发多线程 开启进程的两种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 技术管理:带人和团队管理
- 下一篇: VB.NET网络是否联通Function