<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # **多進程和守護進程** ## 一 **multiprocessing模塊介紹** python中的多線程無法利用多核優勢,如果想要充分地使用多核CPU的資源(os.cpu_count()查看),在python中大部分情況需要使用多進程。 Python提供了multiprocessing。 multiprocessing模塊用來開啟子進程,并在子進程中執行我們定制的任務(比如函數),該模塊與多線程模塊threading的編程接口類似。 multiprocessing模塊的功能眾多:支持子進程、通信和共享數據、執行不同形式的同步,>提供了Process、Queue、Pipe、Lock等組件。 >與線程不同,進程沒有任何共享狀態,進程修改的數據,改動僅限于該進程內。 ## 二 **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.terminate():強制終止進程p,可能產生僵尸進程和死鎖 p.is_alive():判斷子進程p是否仍然運行,返回True p.join([timeout]):主線程阻塞,等待子進程p終止后再繼續,timeout可選。 ~~~ ### **屬性介紹:** ~~~ p.daemon:讓子進程以守護進程方式運行,必須在p.start()之前設置 p.name:獲取子進程的名稱 p.pid:獲取子進程的pid ~~~ ## **三 Process類的使用** python用multiprocessing創建多進程有兩種方式,一種是使用`Process`類直接創建,一種是繼承`Process`類創建自己的類來使用 **注意:在windows中Process()必須放到# if \_\_name\_\_ == '\_\_main\_\_':下** ### **創建并開啟子進程的方式一** ~~~python import time,random from multiprocessing import Process def piao(name): print('%s piaoing' %name) time.sleep(random.randrange(1,5)) print('%s piao end' %name) if __name__ == '__main__': #實例化得到2個對象 p1=Process(target=piao,args=('egon',)) #必須加逗號 p2=Process(target=piao,args=('alex',)) #調用對象下start的方法,開啟2個進程 p1.start() p2.start() print('主.....') ~~~ **運行結果** ``` 主..... egon piaoing alex piaoing egon piao end alex piao end ``` ### **創建并開啟子進程的方式二** 自定義類的時候,必須要實現run方法,因為`Process`中的`start`方法就是調用的`run`方法實現的,當然最好也要用super方法繼承父類的初始化數據. ~~~ import time import random from multiprocessing import Process class Piao(Process): def __init__(self,name): super().__init__() self.name=name def run(self): print('%s piaoing' %self.name) time.sleep(random.randrange(1,5)) print('%s piao end' %self.name) if __name__ == '__main__': #實例化得到2個對象 p1=Piao('egon') p2=Piao('alex') #調用對象下start的方法,開啟2個進程 p1.start() #start會自動調用run p2.start() print('主....') ~~~ 運行結果同上 ## **四 Process對象的join方法** 在主進程運行過程中如果想并發地執行其他的任務,我們可以開啟子進程,此時主進程的任務與子進程的任務分兩種情況 * 情況一: 在主進程的任務與子進程的任務彼此獨立的情況下,主進程的任務先執行完畢后,主進程還需要等待子進程執行完畢,然后統一回收資源。 * 情況二: 如果主進程的任務在執行到某一個階段時,需要等待子進程執行完畢后才能繼續執行,就需要有一種機制能夠讓主進程檢測子進程是否運行完畢,在子進程執行完畢后才繼續執行,否則一直在原地阻塞,這就是join方法的作用 ### 演示代碼: ~~~ from multiprocessing import Process import time,random,os def task(): print('%s is piaoing' %os.getpid()) time.sleep(random.randrange(1,3)) print('%s is piao end' %os.getpid()) if __name__ == '__main__': p1=Process(target=task) p2=Process(target=task) p1.start() p2.start() p1.join()#等待p停止,才執行下一行代碼 p2.join() print('主') #執行結果 6096 is piaoing 9776 is piaoing 6096 is piao end 9776 is piao end 主 ~~~ >p.join()是讓主線程等待p的結束,卡住的是主進程而絕非子進程p 可以使用for 循環來簡化代碼 ~~~ p_l=[p1,p2,p3,p4] for p in p_l: p.start() for p in p_l: p.join() ~~~ ## **五 守護進程** 關于守護進程需要強調兩點: 其一:守護進程會在主進程代碼執行結束后就終止 其二:守護進程內無法再開啟子進程,否則拋出異常 >如果我們有兩個任務需要并發執行,那么開一個主進程和一個子進程分別去執行就ok了 >如果子進程的任務在主進程任務結束后就沒有存在的必要了,那么該子進程應該在開啟前就被設置成守護進程。 >主進程代碼運行結束,守護進程隨即終止 ~~~ from multiprocessing import Process import time,random def task(name): print('%s is piaoing' %name) time.sleep(random.randrange(1,3)) print('%s is piao end' %name) if __name__ == '__main__': p=Process(target=task,args=('egon',)) p.daemon=True #一定要在p.start()前設置 p.start() print('主......') #只要終端打印出這一行內容,那么守護進程p也就跟著結束掉了 #運行結果:子進程還沒來得及打印,主進程就結束了,子進程也就結束了 主...... ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看