1. 程式人生 > >python並發編程(守護進程,進程鎖,進程隊列)

python並發編程(守護進程,進程鎖,進程隊列)

nowait 普通 ons join proc 消費者 rom 生產者 問題

進程的其他方法

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(主進程結束)

python並發編程(守護進程,進程鎖,進程隊列)