生產者消費者模型,管道,程序之間共享記憶體,程序池

2022-09-11 14:18:32 字數 2769 閱讀 1362

課程回顧:

並行:在同一時間點上多個任務同時執行

併發:在同一時間段上多個任務同時執行

程序的三大基本狀態:

就緒狀態:所有程序需要的資源都獲取到了,除了cpu

執行狀態:獲取到了所有資源包括cpu,程序處於執行狀態

阻塞狀態:程式停滯不在執行,放棄cpu,程序此時處於記憶體裡

什麼叫程序?

正在執行的程式

有**段,資料段,pcb(程序控制塊)

程序是資源分配的基本單位.

程序之間能不能直接通訊?

正常情況下,多程序之間是無法進行通訊的.因為每個程序都有自己獨立的空間

鎖: 為了多程序通訊時,保護資料的安全性

一把鎖配一把鑰匙

l = lock()

l.acquire()

l.release()

訊號量:

一把鎖配多把鑰匙

sem = semaphore(num)    ### num 鑰匙的數量

事件:e = event()

e.is_set()  返回乙個bool值

e.wait()    阻塞和非阻塞

e.set()    把is_set的bool值變為true

e.clear()    把is_set的bool值變為false

今日內容:

1.生產者消費者模型

主要是為解耦

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

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

佇列:先進先出(first in first out)   簡稱:  fifo

import queue #不能進行多執行緒之間的資料模型

(1)from multiprocessing import queue  借助queue解決生產者消費者模型

佇列是安全的.

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 multipressing 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)

程序最好開p個   p就是cpu核數加上1

程序池有三個方法:

map(func,iterable)

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

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

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

args:可迭代物件型的引數,是傳給任務函式的引數

同步處理任務時,不需要close和join

同步處理任務時,程序池中的所有程序都是普通程序(主程序需要等待其執行結束)

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

args:可迭代帶物件型的引數,是傳給任務函式的引數

callback:**函式,就是說每當程序池中有程序處理完任務了,返回的結果可以交給函式,由**函式進行進一步的處理,**函式只有非同步才有,同步是沒有的

非同步處理任務時,程序池中的所有程序都是守護程序(主程序**執行完畢守護程序就結束)

非同步處理任務時,必須加上close和join

管道實現生產者消費者模型

管道實現生產者消費者模型 應該特別注意管道端點的正確管理問題,如果是生產者或消費者中都沒有使用管道的端點就應該將它關閉 這也說明了為何在生產者中關閉了管道的輸出端,在消費者中關閉管道的輸入端。如果忘記執行這個步驟 程式可能在消費者中的recv 操作上掛起。管道是由作業系統進行引用計數的,必須在所有程...

執行緒之間生產者和消費者模型

ifndef cache h define cache h include include include include include include include include 傳入的資料型別t構造函式引數應該設定沒有,否則編譯出錯 templateclass cachequeue tem...

程序與生產者消費者模型

程序應用 1.遠端執行命令 usr src python coding utf 8 import paramiko,time,re from multiprocessing import process import configparser def cmd remote hostname,port...