python並行任務之生產消費模式

2021-09-09 04:25:48 字數 2809 閱讀 2603

一. 生產者/

消費者模式

概念:生產者產生一塊資料,放到buffer

中,與此同時,消費者在從buffer中取出並消耗這些資料

理解:像生活中廠家生產出產品,顧客購買消耗這些產品,buffer就是存放商品的倉庫。

二.生產者/消費者模式在python中的實現

簡單介紹:python中,佇列是執行緒間最常用的交換資料的形式之一。queue模組是python中提供佇列操作的模組。

原理:它建立乙個"佇列"物件(即用於存放資料的buffer), 然後不斷產生資料並存入該"佇列",同時也在不斷

地從該佇列中取出資料。

具體函式

(1)建立乙個佇列物件

1 >>> import

queue

2 >>> q = queue.queue()

注:佇列長度可為無限或有限。可通過queue的建構函式的可選引數maxsize來設定佇列長度。若maxsize小於1則表示佇列長度無限,例:

(2)向佇列中存入資料

方法:q.put(item, block=true, timeout=none)

>>> q.put('a')
注:put()有兩個引數,第乙個item為必需的,為插入專案的值;第二個block為可選引數,預設為1。

如果佇列當前為空且block為1,put()方法就使呼叫執行緒暫停,直到空出乙個資料單元。如果block為0,put方法將引發full異常。

(3)從佇列中取出資料

方法:q.get(block=true, timeout=none)

>>> q.get()
注:get方法可選引數為block,預設為true。

如果隊列為空且block為true,get()就使呼叫執行緒暫停,直至有專案可用。如果隊列為空且block為false,佇列將引發empty異常。

queue.queue中常用方法:

q.qsize()           返回佇列的大小

q.empty()           如果隊列為空,返回true,反之false

q.full()           如果佇列已滿,返回true,反之false。與 maxsize 大小對應

q.get([block[, timeout]]) 獲取佇列,timeout等待時間

q.get_nowait()      相當q.get(false) 非阻塞

q.put(item,timeout)    寫入佇列,timeout等待時間

q.put_nowait(item)   相當q.put(item, false)

q.task_done()        完成一項工作之後, 函式向任務已經完成的佇列傳送乙個訊號

q.join()           表示等到隊列為空,再執行別的操作

例項測試:

#

!/usr/bin/env python

#coding=utf-8

import

threading, time

import queue #

匯入訊息佇列模組

import random #

匯入隨機數模組,是為了模擬生產者與消費者速度不一致的情形q = queue.queue()#

例項化乙個佇列物件,當有多個執行緒共享乙個東西的時候就可以用它了

def producer(): #

生產者函式

for i in range(20):q.put(i)

#將結果放入訊息佇列中

print

'[+] product %s

' %i

time.sleep(random.randrange(3)) #

生產者的生產速度,3s內

def consumer(): #

消費者函式

count =0

while count < 20:data= q.get()#

取用訊息佇列中存放的結果

print

'[-] consume %s

' %data

count += 1time.sleep(random.randrange(4)) #

消費者的消費速度,4s內

producter = threading.thread(target =producer)

consumer = threading.thread(target =consumer)

producter.start()

consumer.start()

執行結果:

並行模式之生產者消費者

生產者 消費者模式是乙個經典的多執行緒設計模式,它為多執行緒的協作提供了良好的解決方案。在生產者 消費者模式中,通常有兩類執行緒,即若干個生產者執行緒和若干個消費者執行緒。生產者執行緒負責提交使用者請求,消費者執行緒負責處理使用者請求。生產者和消費者之間通過共享記憶體緩衝區進行通訊。生產者和消費者分...

Python之Queue模組以及生產消費者模型

佇列類似於一條管道,元素先進先出,進put arg 取get 有一點需要注意的是 佇列都是在記憶體中操作,程序退出,佇列清空,另外,佇列也是乙個阻塞的形態.佇列有很多中,但都依賴模組queue 佇列方式 特點 queue.queue 先進先出佇列 queue.lifoqueue 後進先出佇列 que...

Python多工 並行 併發

1.什麼是 多工 呢?簡單地說,就是作業系統可以同時執行多個任務 在 裡面,就是乙個程式有多個地方同時執行 打個比方,你一邊用著這瀏覽器上網,一邊在聽 一邊在用word趕作業,這就是多工 2.單核cpu是怎麼解決多工的?單核 意味著同一時刻只能執行一件事情 作業系統輪流讓各任務交替執行,任務1執行0...