1. 程式人生 > >python多執行緒(3)---生產者與消費者(執行緒通訊)和Queue模組

python多執行緒(3)---生產者與消費者(執行緒通訊)和Queue模組

Queue模組可以進行執行緒通訊。比如生產者產生貨物,貨物放入佇列,通過通訊,消費者取得貨物。Queue被稱為通用佇列模組
queue(size)產生一個佇列,佇列模式有3種,針對這三種佇列分別有三個建構函式:

1 FIFO佇列先進先出:class Queue.Queue(maxsize)
2 LIFO類似於堆,即先進後出:class Queue.LifoQueue(maxsize) 
3 優先順序佇列級別越低越先出來:class Queue.PriorityQueue(maxsize)

佇列長度可為無限或者有限。可通過Queue的建構函式的可選引數maxsize來設定佇列長度。如果maxsize小於1就表示佇列長度無限。呼叫佇列物件的put()方法在隊尾插入一個專案。put()有兩個引數,第一個item為必需的,為插入專案的值;第二個block為可選引數, 預設為1。如果隊列當前為空且block為1,put()方法就使呼叫執行緒暫停,直到空出一個數據單元。如果block為0,put方法將引發Full異常。呼叫佇列物件的get()方法從隊頭刪除並返回一個專案。可選引數為block,預設為1。如果佇列為空且block為1,get()就使呼叫執行緒暫停,直至有專案可用。如果block為0,佇列將引發Empty異常。join()保持阻塞狀態,直到處理了佇列中的所有專案為止。在將一個專案新增到該佇列時,未完成的任務的總數就會增加。當使用者執行緒呼叫task_done()以表示檢索了該專案、並完成了所有的工作時,那麼未完成的任務的總數就會減少。當未完成的任務的總數減少到零時,join() 就會結束阻塞狀態。

產生的佇列例項分別有以下操作方法:

方法 描述
Queue.qsize() 返回佇列的大小
Queue.empty() 如果佇列為空,返回True,反之False
Queue.full() 如果佇列滿了,返回True,反之False
Queue.full() 與 maxsize 大小對應
Queue.get([block[, timeout]]) 獲取佇列,timeout等待時間,block不等於0.函式會阻塞到佇列有物件為止
Queue.get_nowait() 相當Queue.get(False)
Queue.put(item,block=0) 寫入佇列,timeout等待時間 ,block不等於0.函式會阻塞到佇列有空間為止
Queue.put_nowait(item) 相當Queue.put(item, False)
Queue.task_done() 在完成一項工作之後,Queue.task_done() 函式向任務已經完成的佇列傳送一個訊號
Queue.join() 實際上意味著等到佇列為空,再執行別的操作

例項:呼叫前面的 MyThread.py

# -*- coding: utf8 -*-

from random import
randint # randint隨機進行生產和消耗 from time import sleep from Queue import Queue from myThread import MyThread #wwrite的貨物物件 def writeQ(queue): print '放置貨物', queue.put('xxx', 1) # 把xxx物件放進佇列中,並等待佇列中有空間為止 print "放置貨物後當前佇列大小", queue.qsize(),'\n' # 返回佇列大小 #取得貨物 def readQ(queue): val = queue.get(1) # 從佇列中取出一個物件(消耗) print val+'\n' print '取出貨物後當前佇列大小', queue.qsize(),'\n' # 返回佇列大小 #writer 放置貨物 def writer(queue, loops): """一次往佇列中放進一個物件,等待一會,然後再做給定次數的相同的事""" for i in range(loops): writeQ(queue) # 呼叫writeQ,放進一個物件 sleep(randint(1, 3)) # 隨機睡眠1~3秒 def reader(queue, loops): """一次從佇列中取出一個物件,等待一會,然後做給定次數的相同的事""" for i in range(loops): readQ(queue) sleep(randint(2, 5)) # 睡眠時間比 write 中的長,以使 reader 在取資料的時候能夠拿到資料 funcs = [writer, reader] nfuncs = range(len(funcs)) def main(): nloops = randint(2, 5) q = Queue(32) # 建立一個大小為32的物件,和 q 繫結 threads = [] for i in nfuncs: t = MyThread(funcs[i], (q, nloops), funcs[i].__name__) # 例項化 writer, reader 這兩個物件 threads.append(t) # 放入空列表中 for i in nfuncs: threads[i].start() # 啟動執行緒 for i in nfuncs: threads[i].join() # join()會等到執行緒結束或超時,即允許主執行緒等待執行緒結束 print 'all DONE' if __name__ == '__main__': # 獨立執行指令碼 main()

輸出:

starting writer at: Wed Jul 20 12:18:51 2016
放置貨物 starting Nonereader
 放置貨物後當前佇列大小at:  1Wed Jul 20 12:18:51 2016 


xxx

取出貨物後當前佇列大小 0 

放置貨物 None
放置貨物後當前佇列大小 1 

xxx

取出貨物後當前佇列大小 0 

放置貨物 None
放置貨物後當前佇列大小 1 

xxx

取出貨物後當前佇列大小 0 

放置貨物 None
放置貨物後當前佇列大小 1 

放置貨物 None
放置貨物後當前佇列大小 2 

xxx

取出貨物後當前佇列大小 1 

writer finished at: Wed Jul 20 12:19:02 2016
xxx

取出貨物後當前佇列大小 0 

reader finished at: Wed Jul 20 12:19:08 2016
all DONE

相關推薦

python執行3---生產者消費者執行通訊Queue模組

Queue模組可以進行執行緒通訊。比如生產者產生貨物,貨物放入佇列,通過通訊,消費者取得貨物。Queue被稱為通用佇列模組 queue(size)產生一個佇列,佇列模式有3種,針對這三種佇列分別有三個建構函式: 1 FIFO佇列先進先出:class Queu

Python執行學習(三、生產者消費者)

生產者與消費者問題是典型的同步問題。這裡簡單介紹兩種不同的實現方法。 1,條件變數 import threading import time class Producer(threading.Thread): def __init__(self, t_name)

使用Condition物件實現執行同步,模擬生產者消費者問題。

使用列表模擬物品池,生產者往裡放置東西,而消費者從池中獲取物品。物品池滿時生產者等待,空時消費者等待。假設物品池裡面能夠容納5個元素,每個元素都是1-1000之間的整數。請編寫程式碼實現並檢視執行結果。 import threading from random import randin

作業系統-使用訊號量實現生產者消費者C++實現

常用函式: HANDLE WINAPI CreateSemaphore(                  _In_opt_  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes   _In_      LONG lInitialCoun

java執行-生產者消費者模型有限緩衝問題

文章目錄 @[toc] 1.預備知識點 2.問題描述 3.java實現方式的預備知識 4.實現 1.預備知識點 執行緒同步 同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。“同

生產者消費者模型基於單鏈表、環形佇列、執行消費生產

#include <pthread.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <semaphore.h> #define SIZE 10 sem_t

Java執行2.4.生產者消費者之間的關係3

生產者與消費者之間的關係 1、執行緒間通訊舉例的問題解決2 (1)建立學生類 package cn.itcast_05; public class Student { String name; int age; boolean flag; // 預設情況是沒有

執行的同步互斥 互斥量 條件變數 訊號量生產者消費者模型

執行緒 執行緒是程序中的一個獨立的執行流,由環境(包括暫存器集和程式計數器)和一系列要執行的置零組成。所有程序至少有一個執行緒組成,多執行緒的程序包括多個執行緒,所有執行緒共享為程序分配的公共地址空間,所以文字段(Text Segment)和資料段(Datan

生產者消費者模式執行的同步互斥

條件變數 條件變數的提出首先要涉及一個概念,就是生產者消費者模型: 生產者消費者,是在多執行緒同步的一個問題,兩個固定大小緩衝區的執行緒,在實際執行是會發生問題,生產者是生成資料放入緩衝區,重複過程,消費者在緩衝區取走資料。 生產者消費者的模型提出了三種關係,兩種角色,

JAVA執行生產者消費者

業務需求:      生產20個饅頭,籃子裡只能放6個饅頭。      消費者發現籃子裡有饅頭可以食用時即可把饅頭取出開始使用,直到籃子裡饅頭為空。      生產者發現籃子裡的饅頭不滿足6個時,生產者開始生產饅頭並放入籃子中。  具體實現:  第一步:建立盛放饅頭的籃子類

執行學習之生產者消費者

感悟:   生產者和消費者其實就是一個很簡單的一個多執行緒同步的例子,但是我卻花了好多天才能理解。反思下來就是缺乏實踐,這聽起來感覺很簡單的一個道理,但是能做到可就很難了。當初在看這個生產者和消費者例項的時候,看著感覺程式碼能簡單,大致上能理解,但是到了轉天自己卻又寫不出來了

【JAVA執行】如何解決一個生產者消費者問題

                             如何解決一個生產者與消費者問題 生產者與消費者問題是多執行緒同步的一個經典問題。生產者和消費者同時使用一塊緩衝區,生產者生產商品放入緩衝區,消費者從緩衝區中取出商品。我們需要保證的是,當緩衝區滿時,生產者不可生產商品

Java執行生產者消費者等待喚醒機制(示例)

在下面新建的兩條執行緒,兩條執行緒操作的物件都是學生類,一條執行緒生產學生物件的資料,一條執行緒消費學生物件的資料,且做到,有資料才消費,沒資料就等待,沒資料就生產,有資料就等待。 第一個案例是學生類物件,非常的簡單就定義了兩個成員變數,以及一個用於喚醒執行緒的標記。 成員變數預設會賦值

Python實戰之processing程序程序,程序池,lock鎖,程序間的通訊

首先須知 什麼是IO? 從硬碟讀塊資料,從網路讀塊資料屬於IO操作(IO操作不佔用cpu) 計算佔用cpu,如:1+1 Python多執行緒其實就是一個執行緒,由於利用CUP的上下文切換看起來就像是併發..上下文切換消耗資源 Python多執行緒 不適合CPU密集操作型的任務,適

java執行--ReentrantLock實現生產者消費者模式

一.本例實現 :一對一交替列印, 一.生產者邏輯 :每次只允許一個生產者來進行生產操作(生產者之間互斥訪問倉庫),必須等消費者取走資料之後,才能進行下一次的生產 二.消費者邏輯 :每次只允許一個消費者來進行生產操作(消費者之間互斥訪問倉庫),必須等生產者生產資料之後,才能

執行實現生產者消費者模式

生產者-消費者模式的簡介: 在實際的軟體開發過程中,我們將產生資料的模組稱為生產者,處理資料的模組成為消費者。但僅有這兩者還不夠成為一個生產者-消費者模式,還需要有一個緩衝區(一段記憶體區域)作為中介,生產者產生的資料放入緩衝區,消費者從緩衝區讀取資料並處理。

IOS執行使用GCD訊號量實現生產者消費者模式

一、原理的簡述   在生產者消費者模式當中,首先需要分清在這個模式當中有哪些角色? 各角色分別擔任什麼職責與它們之間的關係如何? 角色之間是在保證資料的準確性的情況下如何通訊(同步資料)的? 假設現在有一個這樣的情形: 有兩個人共同訪問一個容量有限的倉庫,這2個人,

Java學習7:同步問題之生產者消費者的問題

con runnable pop pre 標記 this auth style about 生產者生產饅頭,消費者消費饅頭。一個籃子,生產者往籃子中放饅頭,消費者從籃子中取饅頭。 /** * 這是一個籃子類 * * @author xcx * @time 2017

Spring筆記023種加載配置文件的方式

con 創建對象 face ati prototype property str als cati 1.不使用Spring的實例: 01.Animal接口對應的代碼: package cn.pb.dao; /** * 動物接口 */ public interface

使用Python線程實現生產者消費者模型

watermark vpd 51cto 實現 this read sleep get DG 1,我所使用到的python版本 2,下面編寫具體的實現過程 import threadingimport time import Queue #首先生成一個隊列q =Queue.