python併發程式設計之程式1(守護程式,程式鎖,程式佇列)

吾有一劍發表於2019-01-10

程式的其他方法

P = Process(target=f,)

P.Pid 檢視程式號  檢視程式的名字p.name

P.is_alive()  返回一個true或者False

P.terminate()  給作業系統傳送一個結束程式的訊號

驗證程式之間是空間隔離的

 

from multiprocessing import Process

num = 100

def f1():
    global num
    num = 3
    print(num)  # 結果 3

if __name__ == `__main__`:
    p = Process(target=f1,)
    p.start()
    p.join()
    print(num)  # 結果 100

 

 

 

 

守護程式

主程式的程式碼執行完畢設定為守護程式的子程式會隨之結束

P.daemon = True

import time
from multiprocessing import Process

def f1():
    time.sleep(3)
    print(`xxxx`)

def f2():
    time.sleep(5)
    print(`普通子程式的程式碼`)

if __name__ == `__main__`:

    p = Process(target=f1,)
    p.daemon = True  
    p.start()
    p2 = Process(target=f2,)
    p2.start()
    print(`主程式結束`)  #  守護程式會跟跟著父程式的程式碼執行結束,就結束

程式鎖 

資料共享  manager

多程式操作共享資料(檔案內容)的時候,會造成資料不安全的問題

保證資料安全,但是犧牲了效率,加鎖的這段程式碼大家變成了(同步)序列執行的狀態,又叫同步鎖互斥鎖

兩種鎖的方式

l = Lock()

1).with l:

    鎖中內容

2).

l.acquire()

鎖中內容

l.release()

import time
from multiprocessing import Process,Manager,Lock

def f1(m_d,l2):
    with l2:
        # l2.acquire()
        tmp = m_d[`num`]
        tmp -= 1
        time.sleep(0.1)
        m_d[`num`] = tmp
        # l2.release()

if __name__ == `__main__`:
    m = Manager()
    l2 = Lock()
    m_d = m.dict({`num`:100})
    p_list = []
    for i in range(10):
        p = Process(target=f1,args=(m_d,l2))
        p.start()
        p_list.append(p)

    [pp.join() for pp in p_list]

    print(m_d[`num`])

佇列

Queue()

Q = Queue(10)

Q.put() 放資料

Q.get() 取資料

Q.qsize() 返回的是當前佇列中內容的長度

Q.put_nowait()  不等待,但是報錯

Q.get_nowait()  不等待,也是報錯

Q.full()  q.empty() 

用佇列實現消費者生產者模型 : 緩衝用,解耦用的,

import time
from multiprocessing import Process,Queue,JoinableQueue
#生產者 def producer(q): for i in range(10): time.sleep(0.2) s = `大包子%s號`%i print(s+`新鮮出爐`) q.put(s) q.join() #就等著task_done()訊號的數量,和我put進去的數量相同時,才繼續執行 print(`所有的任務都被處理了`) #消費者 def consumer(q): while 1: time.sleep(0.5) baozi = q.get() print(baozi+`被吃了`) q.task_done() #給佇列傳送一個取出的這個任務已經處理完畢的訊號 if __name__ == `__main__`: # q = Queue(30) q = JoinableQueue(30) #同樣是一個長度為30的佇列 pro_p = Process(target=producer,args=(q,)) con_p = Process(target=consumer,args=(q,)) pro_p.start() con_p.daemon = True con_p.start() pro_p.join() print(`主程式結束`)

相關文章