Python 進程操作之multiprocess模塊及創建

      網友投稿 1040 2022-05-30

      在python程序中的進程操作

      之前我們已經了解了很多進程相關的理論知識,了解進程是什么應該不再困難了,剛剛我們已經了解了,運行中的程序就是一個進程。所有的進程都是通過它的父進程來創建的。因此,運行起來的python程序也是一個進程,那么我們也可以在程序中再創建進程。多個進程可以實現并發效果,也就是說,當我們的程序中存在多個進程的時候,在某些時候,就會讓程序的執行速度變快。以我們之前所學的知識,并不能實現創建進程這個功能,所以我們就需要借助python中強大的模塊。

      multiprocess模塊

      仔細說來,multiprocess不是一個模塊而是python中一個操作、管理進程的包。 之所以叫multi是取自multiple的多功能的意思,在這個包中幾乎包含了和進程有關的所有子模塊。由于提供的子模塊非常多,為了方便大家歸類記憶,我將這部分大致分為四個部分:創建進程部分,進程同步部分,進程池部分,進程之間數據共享。

      multiprocess.process模塊

      1、process模塊介紹

      process模塊是一個創建進程的模塊,借助這個模塊,就可以完成進程的創建。

      Process([group?[,?target?[,?name?[,?args?[,?kwargs]]]]]),由該類實例化得到的對象,表示一個子進程中的任務(尚未啟動) 強調: 1.?需要使用關鍵字的方式來指定參數 2.?args指定的為傳給target函數的位置參數,是一個元組形式,必須有逗號 參數介紹: group參數未使用,值始終為None target表示調用對象,即子進程要執行的任務 args表示調用對象的位置參數元組,args=(1,2,'egon',) kwargs表示調用對象的字典,kwargs={'name':'egon','age':18} name為子進程的名稱

      方法介紹:

      p.start():啟動進程,并調用該子進程中的p.run()? p.run():進程啟動時運行的方法,正是它去調用target指定的函數,我們自定義類的類中一定要實現該方法?? p.terminate():強制終止進程p,不會進行任何清理操作,如果p創建了子進程,該子進程就成了僵尸進程,使用該方法需要特別小心這種情況。 如果p還保存了一個鎖那么也將不會被釋放,進而導致死鎖 p.is_alive():如果p仍然運行,返回True p.join([timeout]):主線程等待p終止(強調:是主線程處于等的狀態,而p是處于運行的狀態)。timeout是可選的超時時間,需要強調的是, p.join只能join住start開啟的進程,而不能join住run開啟的進程

      屬性介紹:

      p.daemon:默認值為False,如果設為True,代表p為后臺運行的守護進程,當p的父進程終止時,p也隨之終止,并且設定為True后,p不能創建自己的新進程, 必須在p.start()之前設置 p.name:進程的名稱 p.pid:進程的pid p.exitcode:進程在運行時為None、如果為–N,表示被信號N結束(了解即可) p.authkey:進程的身份驗證鍵,默認是由os.urandom()隨機生成的32字符的字符串。這個鍵的用途是為涉及網絡連接的底層進程間通信提供安全性, 這類連接只有在具有相同的身份驗證鍵時才能成功(了解即可)

      在windows中使用process模塊的注意事項:

      在Windows操作系統中由于沒有fork(linux操作系統中創建進程的機制),在創建子進程的時候會自動?import?啟動它的這個文件, 而在?import?的時候又執行了整個文件。因此如果將process()直接寫在文件中就會無限遞歸創建子進程報錯。 所以必須把創建子進程的部分使用if?__name__?==‘__main__’?判斷保護起來,import?的時候??,就不會遞歸運行了。

      2、使用process模塊創建進程

      在一個python進程中開啟子進程,start方法和并發效果。

      在python中啟動的第一個進程:

      import?time from?multiprocessing?import?Process def?f(name): ????print('hello',?name) ????print('我是子進程') if?__name__?==?'__main__': ????p?=?Process(target=f,?args=('bob',)) ????p.start() ????time.sleep(1) ????print('執行主進程的內容了')

      join方法:

      import?time from?multiprocessing?import?Process def?f(name): ????print('hello',?name) ????time.sleep(1) ????print('我是子進程') if?__name__?==?'__main__': ????p?=?Process(target=f,?args=('bob',)) ????p.start() ????#p.join() ????print('我是父進程')

      查看主進程和子進程的進程號:

      import?os from?multiprocessing?import?Process def?f(x): ????print('子進程id?:',os.getpid(),'父進程id?:',os.getppid()) ????return?x*x if?__name__?==?'__main__': ????print('主進程id?:',?os.getpid()) ????p_lst?=?[] ????for?i?in?range(5): ????????p?=?Process(target=f,?args=(i,)) ????????p.start()

      進階,多個進程同時運行(注意,子進程的執行順序不是根據啟動順序決定的)

      多個進程同時運行:

      import?time from?multiprocessing?import?Process def?f(name): ????print('hello',?name) ????time.sleep(1) if?__name__?==?'__main__': ????p_lst?=?[] ????for?i?in?range(5): ????????p?=?Process(target=f,?args=('bob',)) ????????p.start() ????????p_lst.append(p)

      多個進程同時運行,再談join方法(1):

      import?time from?multiprocessing?import?Process def?f(name): ????print('hello',?name) ????time.sleep(1) if?__name__?==?'__main__': ????p_lst?=?[] ????for?i?in?range(5): ????????p?=?Process(target=f,?args=('bob',)) ????????p.start() ????????p_lst.append(p) ????????p.join() ????#?[p.join()?for?p?in?p_lst] ????print('父進程在執行')

      多個進程同時運行,再談join方法(2):

      import?time from?multiprocessing?import?Process def?f(name): ????print('hello',?name) ????time.sleep(1) if?__name__?==?'__main__': ????p_lst?=?[] ????for?i?in?range(5): ????????p?=?Process(target=f,?args=('bob',)) ????????p.start() ????????p_lst.append(p) ????#?[p.join()?for?p?in?p_lst] ????print('父進程在執行')

      除了上面這些開啟進程的方法,還有一種以繼承Process類的形式開啟進程的方式

      通過繼承Process類開啟進程:

      import?os from?multiprocessing?import?Process class?MyProcess(Process): ????def?__init__(self,name): ????????super().__init__() ????????self.name=name ????def?run(self): ????????print(os.getpid()) ????????print('%s?正在和女主播聊天'?%self.name) p1=MyProcess('wupeiqi') p2=MyProcess('yuanhao') p3=MyProcess('nezha') p1.start()?#start會自動調用run p2.start() #?p2.run() p3.start() p1.join() p2.join() p3.join() print('主線程')

      Python 進程操作之multiprocess模塊及創建

      進程之間的數據隔離問題:

      from?multiprocessing?import?Process def?work(): ????global?n ????n=0 ????print('子進程內:?',n) if?__name__?==?'__main__': ????n?=?100 ????p=Process(target=work) ????p.start() ????print('主進程內:?',n)

      3、守護進程

      會隨著主進程的結束而結束。

      主進程創建守護進程

      其一:守護進程會在主進程代碼執行結束后就終止

      其二:守護進程內無法再開啟子進程,否則拋出異常:AssertireplaceString: daemonic processes are not allowed to have children

      注意:進程之間是互相獨立的,主進程代碼運行結束,守護進程隨即終止

      守護進程的啟動:

      import?os import?time from?multiprocessing?import?Process class?Myprocess(Process): ????def?__init__(self,person): ????????super().__init__() ????????self.person?=?person ????def?run(self): ????????print(os.getpid(),self.name) ????????print('%s正在和女主播聊天'?%self.person) p=Myprocess('哪吒') p.daemon=True?#一定要在p.start()前設置,設置p為守護進程,禁止p創建子進程,并且父進程代碼執行結束,p即終止運行 p.start() time.sleep(10)?#?在sleep時查看進程id對應的進程ps?-ef|grep?id print('主')

      主進程代碼執行結束守護進程立即結束:

      from?multiprocessing?import?Process def?foo(): ????print(123) ????time.sleep(1) ????print("end123") def?bar(): ????print(456) ????time.sleep(3) ????print("end456") p1=Process(target=foo) p2=Process(target=bar) p1.daemon=True p1.start() p2.start() time.sleep(0.1) print("main-------")#打印該行則主進程代碼結束,則守護進程p1應該被終止.#可能會有p1任務執行的打印信息123,因為主進程打印main----時,p1也執行了,但是隨即被終止.

      4、socket聊天并發實例

      使用多進程實現socket聊天并發-server:

      from?socket?import?* from?multiprocessing?import?Process server=socket(AF_INET,SOCK_STREAM) server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) server.bind(('127.0.0.1',8080)) server.listen(5) def?talk(conn,client_addr): ????while?True: ????????try: ????????????msg=conn.recv(1024) ????????????if?not?msg:break ????????????conn.send(msg.upper()) ????????except?Exception: ????????????break if?__name__?==?'__main__':?#windows下start進程一定要寫到這下面 ????while?True: ????????conn,client_addr=server.accept() ????????p=Process(target=talk,args=(conn,client_addr)) ????????p.start()

      client端:

      from?socket?import?* client=socket(AF_INET,SOCK_STREAM) client.connect(('127.0.0.1',8080)) while?True: ????msg=input('>>:?').strip() ????if?not?msg:continue ????client.send(msg.encode('utf-8')) ????msg=client.recv(1024) ????print(msg.decode('utf-8'))

      5、多進程中的其他方法

      進程對象的其他方法:terminate,is_alive

      from?multiprocessing?import?Process import?time import?random class?Myprocess(Process): ????def?__init__(self,person): ????????self.name=person ????????super().__init__() ????def?run(self): ????????print('%s正在和網紅臉聊天'?%self.name) ????????time.sleep(random.randrange(1,5)) ????????print('%s還在和網紅臉聊天'?%self.name) p1=Myprocess('哪吒') p1.start() p1.terminate()#關閉進程,不會立即關閉,所以is_alive立刻查看的結果可能還是存活 print(p1.is_alive())?#結果為True print('開始') print(p1.is_alive())?#結果為False

      進程對象的其他屬性:pid和name

      class?Myprocess(Process): ????def?__init__(self,person): ????????self.name=person???#?name屬性是Process中的屬性,標示進程的名字 ????????super().__init__()?#?執行父類的初始化方法會覆蓋name屬性 ????????#self.name?=?person?#?在這里設置就可以修改進程名字了 ????????#self.person?=?person?#如果不想覆蓋進程名,就修改屬性名稱就可以了 ????def?run(self): ????????print('%s正在和網紅臉聊天'?%self.name) ????????#?print('%s正在和網紅臉聊天'?%self.person) ????????time.sleep(random.randrange(1,5)) ????????print('%s正在和網紅臉聊天'?%self.name) ????????#?print('%s正在和網紅臉聊天'?%self.person) p1=Myprocess('哪吒') p1.start() print(p1.pid)????#可以查看子進程的進程id

      軟件開發 人工智能 云計算 機器學習

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:華為云獲TFC“年度最佳云服務商”金蘋果獎
      下一篇:javascript基礎修煉——一道十面埋伏的原型鏈面試題
      相關文章
      中文字幕在线观看亚洲日韩| 亚洲偷自拍另类图片二区| 911精品国产亚洲日本美国韩国| 亚洲国产精品无码观看久久| 亚洲国产综合人成综合网站00| 亚洲色图综合在线| 亚洲人成未满十八禁网站| 亚洲色无码专区一区| 国产亚洲福利在线视频| 亚洲最大的成人网站| 亚洲午夜无码久久久久小说 | 亚洲AV无码乱码在线观看性色扶| 亚洲精华国产精华精华液网站| 亚洲人成综合网站7777香蕉| 67194在线午夜亚洲| 亚洲中文无码mv| 亚洲AV综合永久无码精品天堂| 亚洲国产成人久久一区二区三区| 亚洲精华国产精华精华液| 亚洲欧美在线x视频| 亚洲色丰满少妇高潮18p| 亚洲精品伊人久久久久| 亚洲人成自拍网站在线观看| 亚洲精品无码国产片| 亚洲 无码 在线 专区| 中文亚洲成a人片在线观看| 亚洲线精品一区二区三区影音先锋| 夜夜春亚洲嫩草影院| 亚洲熟妇av一区二区三区 | 国产亚洲精品成人AA片新蒲金| 亚洲人精品午夜射精日韩| 亚洲人成色777777在线观看| 亚洲AV永久青草无码精品| 亚洲午夜久久影院| 亚洲av无码专区在线| 亚洲精品无码不卡在线播放| 亚洲成av人片在线观看天堂无码 | 亚洲一区二区三区在线视频| 亚洲s色大片在线观看| 亚洲精品视频在线播放| 久久综合久久综合亚洲|