python-42-Process多進程

前言

初識 Process 多進程模塊,可以使啓動一個主進程的時候會自動建立一個或多個子進程,進程裏的第一個進程就是主進程json

程序執行的實例,每個進程都有惟一的pid,每一個子進程的數據都是互相隔離的。方法:app

  • .start():開啓一個子進程
  • .join():感知一個子進程的結束
  • .terminate():結束一個子進程
  • .is_alive():查看某個子進程是否還在運行

同步:只能等待一個事情作完了才能作另外一個事情,好比先作完A才能作B。異步

異步:並行作多個事情,好比一邊作A的事情,同時也在作B的事情。函數

1、函數中的多進程

一、沒約束時,不會待進程執行完再執行下面的代碼:學習

from multiprocessing import Process

def func(arg1,arg2):
    print('arg1:',arg1)
    print('arg2:',arg2)

if __name__ == '__main__':
    p=Process(target=func,args=(5,8))
    p.start()
    print('》》》最後一行代碼的打印') # 沒約束時,不會待進程執行完再執行下面的代碼

二、join():感知子進程的結束,將異步變爲同步。ui

# 二、join():感知子進程的結束,將異步變爲同步
from multiprocessing import Process

def func(arg1,arg2):
    print('arg1:',arg1)
    print('arg2:',arg2)

if __name__ == '__main__':
    p=Process(target=func,args=(5,8))
    p.start()
    p.join()        # 感知子進程的結束,將異步變爲同步
    print('》》》最後一行代碼的打印')

 三、多個子進程執行,列表推導式:必須執行完多個子進程後,再執行下面的代碼。spa

from multiprocessing import Process
import time

def func(arg1,arg2):
    print('arg1:',arg1)
    time.sleep(0.1)
    print('arg2:',arg2)

if __name__ == '__main__':
    p_list=[]
    for i in range(5):              # 異步多個子進程執行
        p = Process(target=func, args=(1*i, 10))
        p_list.append(p)
        p.start()
    [p.join() for p in p_list]      # 必須執行完多個子進程後,再執行下面的代碼。
    print('哈哈哈!')

 2、類中的多進程

一、自定義類,繼承Process。3d

注意:傳參數需用繼承的方法解決,super().__init__()code

# 四、另外一種多進程,自定義類繼承Process
from multiprocessing import Process
import time
class My_func(Process):
    def __init__(self,num):
        super().__init__()      # 傳參數需用繼承的方法解決
        self.num=num

    def run(self):
        '''下面多進程要運行的代碼'''
        print(self.num)
        time.sleep(0.1)
        print(self.num*self.num)
if __name__ == '__main__':
    p1=My_func(1)
    p1.start()
    p2=My_func(2)
    p2.start()

 3、守護進程與進程鎖

一、守護進程隨着主進程的代碼執行完畢而結束:p.daemon=True blog

from multiprocessing import Process
import time
def func():
    while 1:
        time.sleep(1)
        print('func1')
if __name__ == '__main__':
    p=Process(target=func)
    p.daemon=True           # 設置爲守護進程
    p.start()
    print(1)
    print(p.is_alive())     # 查看進度是否存在,返回bool
    time.sleep(2)
    # p.terminate()           # 結束一個進程
    print(p.is_alive())
    time.sleep(2)
    print('守護進程隨着全部主進程執行後而結束!!')
    print(p.is_alive())

 二、進程鎖,好比搶票會有多個用戶一塊兒搶。

①沒有鎖進程的狀況下:發現餘票只有一張,但每一個進程都能搶到票了,實際也就只有一張改怎麼辦?

 ②進程鎖:Lock

這樣就能夠解決相似這樣的問題。

from multiprocessing import Process,Lock
import time,json
def find():
    with open(r'test.py')as f:
        d = json.load(f)
    print('剩餘免費門票:%s'%d['count'])

def buy(i,lock):
    lock.acquire()                          # 拿鑰匙
    with open(r'test.py')as f:
        d = json.load(f)
    if d['count']<=0:print('門票已被搶完~')
    else:
        print('恭喜用戶 %s 成功搶到門票了'%i)
    if d['count']!=0:d['count']-=1
    time.sleep(0.2)
    with open(r'test.py','w')as f:
        json.dump(d,f)
    lock.release()                          # 還鑰匙
if __name__ == '__main__':
    for i in range(1):       # 5個進程同時查詢
        p=Process(target=find)
        p.start()
    lock=Lock()
    for i in range(5):
        p1=Process(target=buy,args=(i,lock))
        p1.start()

 歡迎來你們QQ交流羣一塊兒學習:482713805

相關文章
相關標籤/搜索