生產者消費者模型 執行緒池

2022-02-25 17:34:49 字數 1780 閱讀 4676

1.生產者消費者模型

主要是為解耦

借助佇列來實現生產者消費這模型

棧:先進後出(first in last out 簡稱:filo)

佇列:先進先出(fifo)

import queue

from multiprocessing import queue 借助queue解決生產者消費這模型佇列是安全的

q=queue(m)

q = queue(num)

num : 佇列的最大長度

q.get()# 阻塞等待獲取資料,如果有資料直接獲取,如果沒有資料,阻塞等待

q.put()# 阻塞,如果可以繼續往佇列中放資料,就直接放,不能放就阻塞等待

q.get_nowait()# 不阻塞,如果有資料直接獲取,沒有資料就報錯

q.put_nowait()# 不阻塞,如果可以繼續往佇列中放資料,就直接放,不能放就報錯

(2)from multiprocessing import joinablequeue#可連線的佇列

joinablequeue是繼承queue,所以可以使用queue中的方法

並且joinablequeue又多了兩個方法

q.join()# 用於生產者。等待 q.task_done的返回結果,通過返回結果,生產者就能獲得消費者當前消費了多少個資料

q.task_done() # 用於消費者,是指每消費佇列中乙個資料,就給join返回乙個標識。

2.管道

from multiprocessing import pipe

con1,con2 = pipe()

管道是不安全的。

管道是用於多程序之間通訊的一種方式。

如果在單程序中使用管道,那麼就是con1收資料,就是con2發資料。

如果是con1發資料,就是con2收資料

如果在多程序中使用管道,那麼就必須是父程序使用con1收,子程序就必須使用con2發

父程序使用con1發,子程序就必須使用con2收

父程序使用con2收,子程序就必須使用con1發

父程序使用con2發,子程序就必須使用con1收

在管道中有乙個著名的錯誤叫做eoferror。是指,父程序中如果關閉了傳送端,子程序還繼續接收資料,那麼就會引發eoferror。

3 程序之間的共享記憶體

from multiprocessing import manager,value

m = manager()

num = m.dict()

num = m.list([1,2,3])

4 程序池

程序池:乙個池子,裡邊有固定數量的程序。這些程序一直處於待命狀態,一旦有任務來,馬上就有程序去處理。

因為在實際業務中,任務量是有多有少的,如果任務量特別的多,不可能要開對應那麼多的程序數

開啟那麼多程序首先就需要消耗大量的時間讓作業系統來為你管理它。其次還需要消耗大量時間讓

cpu幫你排程它。

程序池還會幫程式設計師去管理池中的程序。

from multiprocessing import pool

p = pool(os.cpu_count() + 1)

程序池有三個方法:

map(func,iterable)

func:程序池中的程序執行的任務函式

iterable: 可迭代物件,是把可迭代物件中的每個元素依次傳給任務函式當引數

**函式的使用:

程序的任務函式的返回值,被當成**函式的形參接收到,以此進行進一步的處理操作

**函式是由主程序呼叫的,而不是子程序,子程序只負責把結果傳遞給**函式

執行緒,生產者消費者模型

什麼是執行緒 1.執行緒是cpu最小的執行單位 2.程序是資源單位 3.如果將作業系統比作工廠的話,程序是車間,執行緒是流水線,而cpu為電源 開啟乙個程序預設有乙個執行緒即主線程 執行緒的兩種開啟方式 例項化thread類 自定義mythread類,繼承thread類,覆蓋run方法 什麼時候需要...

生產者消費者模型

1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...

生產者消費者模型

生產者與消費者 3,2,1 三種關係 生產者與消費者 互斥,同步 消費者與消費者 互斥 生產者與生產者 互斥 條件變數 int pthread cond destroy pthread cond t cond int pthread cond init pthread cond t restrict...