python 多進程詳細總結


多進程:是一個“執行中的程序”。程序是一個沒有生命的實體,只有處理器賦予程序生命時,它才能成為一個活動的實體,我們稱其為進程。進程是一個能獨立運行的基本單位,同時也是系統分配資源和調度的獨立單位。

特征:

  • 動態性:進程的實質是程序在多任務系統中的一次執行過程,進程是動態產生,動態消亡的。
  • 並發性:任何進程都可以同其他進程一起並發執行
  • 獨立性:進程是一個能獨立運行的基本單位,同時也是系統分配資源和調度的獨立單位;
  • 異步性:由於進程間的相互制約,使進程具有執行的間斷性,即進程按各自獨立的、不可預知的速度執行
  • 結構特征:進程由程序、數據和進程控制塊三部分組成。
  • 多個不同的進程可以包含相同的程序:一個程序在不同的數據集里就構成不同的進程,能得到不同的結果;但是執行過程中,程序不能發生改變。

python中多進程模塊multiprocessing的基本使用:

創建並開啟進程的兩種方法:

#方法一 直接調用import time
import random
from multiprocessing import Process
def run(name):
    print('%s runing' %name)
    time.sleep(random.randrange(1,5))
    print('%s running end' %name)


'''
創建三個進程
target表示調用對象,即子進程要執行的任務
args表示調用對象的位置參數元組,args=(1,2,'anne',)
'''
p1=Process(target=run,args=('anne',))   
p2=Process(target=run,args=('alice',))
p3=Process(target=run,args=('biantai',))
p4=Process(target=run,args=('haha',))

p1.start()
p2.start()
p3.start()
p4.start()
print('主進程')
#方法二 繼承式調用
import time
import random
from multiprocessing import Process


class Run(Process):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        print('%s runing' %self.name)
        time.sleep(random.randrange(1,5))
        print('%s runing end' %self.name)

p1=Run('anne')
p2=Run('alex')
p3=Run('ab')
p4=Run('hey')
p1.start() #start會自動調用run
p2.start()
p3.start()
p4.start()
print('主進程')

注:上述代碼的運行順序是啟動程序時主進程隨之啟動,接下來主進程負責創建3個子進程,3個子進程去分別執行自己的任務,此時主進程會繼續往下走,但有的時候我們需要子進程任務結束之后才讓主進程往下走,此時我就需要讓主進程等待子進程完成任務后再往下走。此時就用到了join(), 例如:

import time
import random
from multiprocessing import Process


class Run(Process):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        print('%s runing' %self.name)
        time.sleep(random.randrange(1,5))
        print('%s runing end' %self.name)

p1=Run('anne')
p2=Run('alex')
p3=Run('ab')
p4=Run('hey')
p1.start() #start會自動調用run
p2.start()
p3.start()
p4.start()
p1.join() #等待p1進程停止
p2.join()
p3.join()
p4.join()
print('主線程')

#注意上面的代碼是主進程等待子進程,等待的是主進程,所以等待的總時間是子進程中耗費時間最長的那個進程運行的時間

#上述啟動進程與join進程可以簡寫為
# p_l=[p1,p2,p3,p4]
# 
# for p in p_l:
#     p.start()
# 
# for p in p_l:
#     p.join()

主進程等待子進程結束

進程之間不共享全局變量:

import os
from multiprocessing import Process

a = 100
def run():
    print("子進程正在執行pid為{}".format(os.getpid()))
    global a
    a += 100
    print("子進程執行結束a的值為{}".format(a))

if __name__ == '__main__':
    p=Process(target=run)
    p.start()
    p.join()
    print("父進程{}執行結束a的值為{}".format(os.getppid(),a))

    '''
      結果:
            子進程正在執行pid為57822
            子進程執行結束a的值為200
            父進程16504執行結束a的值為100
      '''


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM