使用Python佇列和多執行緒實現生產者消費者
這個模型使用python來實現相比POSIX來做簡單太多太多了,輪子python都可以寫好了直接呼叫即可,佇列就已經封裝好了對共享資料的安全訪問。在POSIX多執行緒中考慮Mutex和條件變數是一個重點。這是我以前用POSIX pthread函式實現的一個生產者和消費者模型:
-
http://blog.itpub.net/7728585/viewspace-2139638/
(LINUX 執行緒同步) 互斥量、條件變數以及生產者消費者問題
一、實現方式
下面是Python實現的方法,實際上就是使用佇列作為共享資料的中間價這是模組封裝好的,不需要在使用Mutex保護執行緒之間共享資料訪問的
安全性。附帶佇列的測試程式碼,程式碼簡單如下:
點選(此處)摺疊或開啟
-
import threading
-
import time
-
import queue
-
from global_par import global_par
-
#queue is especially useful in threaded programming when information must be exchanged safely between multiple threads.
-
-
def Prod(global_data):
-
"""生產者執行緒"""
-
i = 1
-
qfifo = global_data.get_global_pars("CusQue")
-
while 1:
-
qfifo.put(i)
-
print("生產產品: {} ".format(i))
-
i +=1;
-
return 0
-
-
def Cust(global_data,detail):
-
"""消費者執行緒"""
-
qfifo = global_data.get_global_pars("CusQue")
-
while 1:
-
print("{}:消費產品:{}".format(detail,qfifo.get()))
-
time.sleep(1)
-
return 0
-
-
def main():
-
pthread_list = []
-
global_data = global_par()
-
qfifo = queue.Queue(maxsize=10)
-
global_data.set_global_pars("CusQue",qfifo)
-
-
##建立1個生產者執行緒
-
thread_pro = threading.Thread(target=Prod,args=(global_data,))
-
pthread_list.append(thread_pro)
-
-
##建立10個消費者執行緒
-
for i in range(10):
-
thread_cus = threading.Thread(target=Cust, args=(global_data, "消費執行緒{}".format(i+1),))
-
pthread_list.append(thread_cus)
-
-
for i in pthread_list:
-
i.start()
-
-
for i in pthread_list:
-
i.join
-
-
return 0
-
-
if __name__ == '__main__':
- main()
二、佇列測試程式碼
點選(此處)摺疊或開啟
-
import threading
-
import queue
-
#http://www.cnblogs.com/alex3714/articles/5230609.html
-
-
def my_format(x, y):
-
"""par one: what des your print
-
par two: value
-
"""
-
x = "-->" + x + " {}"
-
print(x.format(y))
-
return
-
-
qfifo = queue.Queue(maxsize=2) ##先進先出佇列 如果達到最大值預設Queue.put()會堵塞 如果為空預設Queue.get()會堵塞
-
qlifo = queue.LifoQueue(maxsize=2) ##後入先出佇列 如果達到最大值預設Queue.put()會堵塞 如果為空預設Queue.get()會堵塞
-
qpri = queue.PriorityQueue(maxsize=2) ##根據優先順序判斷順序小的為優先順序高 如果達到最大值預設Queue.put()會堵塞 如果為空預設Queue.get()會堵塞
-
-
##part0:在佇列增加元素Queue.put(item, block=True, timeout=None) 可以設定是否堵塞
-
my_format("##part0:在佇列增加元素Queue.put(item, block=True, timeout=None):","")
-
qfifo.put(1)
-
qfifo.put(2)
-
##part1:佇列滿了會報queue.Full異常
-
try:
-
qfifo.put(2,timeout=1)
-
except queue.Full as e:
-
my_format("##part1:佇列滿了如果不堵塞會報queue.Full異常", "")
-
-
##part2:出佇列Queue.get(block=True, timeout=None) 可以設定是否堵塞
-
-
my_format("##part2:出佇列Queue.get(block=True, timeout=None) 可以設定是否堵塞:","")
-
qfifo.get()
-
qfifo.get()
-
-
##part3:佇列空如果不堵塞會報異常queue.Empty
-
try:
-
qfifo.get(timeout=1)
-
except queue.Empty as e:
-
my_format("##part3:佇列空如果不堵塞會報異常queue.Empty", "")
-
-
-
##part4:返回佇列的大小Queue.qsize()
-
my_format("##part0:返回佇列的大小Queue.qsize():",qfifo.qsize())
-
-
##part5:返回是否為空的bool值Queue.empty()
-
my_format("##part1:返回是否為空的bool值Queue.empty():",qfifo.empty())
-
-
##part6:返回是否滿的bool值Queue.full()
-
- my_format("##part1:返回是否為空的bool值Queue.full():",qfifo.full())
作者微信:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2152432/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用Python多執行緒實現生產者消費者模式Python執行緒模式
- python 多執行緒實現生產者與消費者模型Python執行緒模型
- python多執行緒+生產者和消費者模型+queue使用Python執行緒模型
- 多執行緒之生產者消費者執行緒
- Java多執行緒——生產者和消費者模式Java執行緒模式
- 多執行緒併發如何高效實現生產者/消費者?執行緒
- Java多執行緒——生產者消費者示例Java執行緒
- Python並行程式設計(六):多執行緒同步之queue(佇列)實現生產者-消費者模型Python並行行程程式設計執行緒佇列模型
- Python-多執行緒及生產者與消費者Python執行緒
- python中多執行緒消費者生產者問題Python執行緒
- 關於Java多執行緒實現生產者和消費者的問題Java執行緒
- 多執行緒下的生產者和消費者-BlockingQueue執行緒BloC
- Java多執行緒14:生產者/消費者模型Java執行緒模型
- Java 多執行緒學習(執行緒通訊——消費者和生產者)Java執行緒
- 阻塞佇列和生產者-消費者模式佇列模式
- C#多執行緒學習(三) 生產者和消費者C#執行緒
- C# 多執行緒學習(3) :生產者和消費者C#執行緒
- java多執行緒:執行緒間通訊——生產者消費者模型Java執行緒模型
- Java 多執行緒基礎(十二)生產者與消費者Java執行緒
- Java多執行緒——消費者與生產者的關係Java執行緒
- 多執行緒-生產者消費者問題程式碼1執行緒
- 使用slice和條件變數實現一個簡單的多生產者多消費者佇列變數佇列
- 什麼是阻塞佇列?如何使用阻塞佇列來實現生產者-消費者模型?佇列模型
- JAVA執行緒消費者與生產者模型Java執行緒模型
- python執行緒通訊與生產者消費者模式Python執行緒模式
- java多執行緒總結六:經典生產者消費者問題實現Java執行緒
- 使用BlockQueue實現生產者和消費者模式BloC模式
- 使用Disruptor實現生產者和消費者模型模型
- 多執行緒-生產者消費者之等待喚醒機制執行緒
- Java多執行緒-併發協作(生產者消費者模型)Java執行緒模型
- Java實現生產者和消費者Java
- 生產者和消費者(.net實現)
- Java 多執行緒(Java.Thread)------ 執行緒協作(生產者消費者模式)Java執行緒thread模式
- 生產者消費者模式--java多執行緒同步方法的應用模式Java執行緒
- 多執行緒 -- 移動檔案(生產者,消費者模式應用)執行緒模式
- Java多執行緒15:Queue、BlockingQueue以及利用BlockingQueue實現生產者/消費者模型Java執行緒BloC模型
- 【RabbitMQ】生產者,消費者,通道,佇列,交換器和繫結MQ佇列
- rabbitMQ實戰生產者-交換機-佇列-消費者細談MQ佇列