使用Python实现生产者消费者问题
之前用C++写过一篇生产者消费者的实现。
生产者和消费者主要是处理互斥和同步的问题:
队列作为缓冲区,需要互斥操作
队列中没有产品,消费者需要等待,直到生产者放入产品并通知它。队列慢的情况类似。
这里我使用list模拟Python标准库的Queue,这里我设置一个大小限制为5:
SyncQueue.py
from threading import Lock
from threading import Condition
class Queue():
def __init__(self):
self.mutex = Lock()
self.full = Condition(self.mutex)
self.empty = Condition(self.mutex)
self.data = [] def push(self, element):
self.mutex.acquire()
while len(self.data) >= 5:
self.empty.wait() self.data.append(element)
self.full.notify()
self.mutex.release() def pop(self):
self.mutex.acquire()
while len(self.data) == 0:
self.full.wait()
data = self.data[0]
self.data.pop(0)
self.empty.notify()
self.mutex.release() return data if __name__ == '__main__':
q = Queue()
q.push(10)
q.push(2)
q.push(13) print q.pop()
print q.pop()
print q.pop()
这是最核心的代码,注意里面判断条件要使用while循环。
接下来是生产者进程,producer.py
from threading import Thread
from random import randrange
from time import sleep
from SyncQueue import Queue class ProducerThread(Thread):
def __init__(self, queue):
Thread.__init__(self)
self.queue = queue
def run(self):
while True:
data = randrange(0, 100)
self.queue.push(data)
print 'push %d' % (data)
sleep(1) if __name__ == '__main__':
q = Queue()
t = ProducerThread(q)
t.start()
t.join()
消费者,Condumer.py
from threading import Thread
from time import sleep
from SyncQueue import Queue class ConsumerThread(Thread):
def __init__(self, queue):
Thread.__init__(self)
self.queue = queue
def run(self):
while True:
data = self.queue.pop()
print 'pop %d' % (data)
sleep(1) if __name__ == '__main__':
q = Queue()
t = ConsumerThread(q)
t.start()
t.join()
最后我们写一个车间类,可以指定线程数量:
from SyncQueue import Queue
from Producer import ProducerThread
from Consumer import ConsumerThread class WorkShop():
def __init__(self, producerNums, consumerNums):
self.producers = []
self.consumers = []
self.queue = Queue()
self.producerNums = producerNums
self.consumerNums = consumerNums
def start(self):
for i in range(self.producerNums):
self.producers.append(ProducerThread(self.queue))
for i in range(self.consumerNums):
self.consumers.append(ConsumerThread(self.queue))
for i in range(len(self.producers)):
self.producers[i].start()
for i in range(len(self.consumers)):
self.consumers[i].start()
for i in range(len(self.producers)):
self.producers[i].join()
for i in range(len(self.consumers)):
self.consumers[i].join() if __name__ == '__main__':
w = WorkShop(3, 4)
w.start()
最后写一个main模块:
from WorkShop import WorkShop if __name__ == '__main__':
w = WorkShop(2, 3)
w.start()
使用Python实现生产者消费者问题的更多相关文章
- python进程——生产者消费者
生产者消费者模型介绍 为什么要使用生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务,在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完 ...
- python之生产者消费者模型
#Auther Bob #--*--conding:utf-8 --*-- #生产者消费者模型,这里的例子是这样的,有一个厨师在做包子,有一个顾客在吃包子,有一个服务员在储存包子,这个服务员我们就可以 ...
- Python多线程-生产者消费者模型
用多线程和队列来实现生产者消费者模型 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threading imp ...
- (python)生产者消费者模型
生产者消费者模型当中有两大类重要的角色,一个是生产者(负责造数据的任务),另一个是消费者(接收造出来的数据进行进一步的操作). 为什么要使用生产者消费者模型? 在并发编程中,如果生产者处理速度很快,而 ...
- python 之生产者消费者模型
进程实现: import time,random from multiprocessing import Process,Queue def producer(name,q): count= 0 wh ...
- python并发——生产者消费者信号量实现
介绍 写扫描器的时候,需要让资产扫描结果一出来(生产者),另外一边就会开个线程去运行漏洞扫描(消费者). 但是又不能让结果没出来,另外一边消费者就开始干活了. 代码 # *coding:UTF-8 * ...
- python实现生产者消费者模型
生产者消费之模型就是,比如一个包子铺,中的顾客吃包子,和厨师做包子,不可能是将包子一块做出来,在给顾客吃,但是单线程只能这麽做,所以用多线程来执行,厨师一边做包子,顾客一边吃包子,当顾客少时,厨师做的 ...
- python 多线程 生产者消费者
import threading import time import logging import random import Queue logging.basicConfig(level=log ...
- Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)
Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Ev ...
随机推荐
- Selenium2+python自动化76-Chrome配置加载【转载】
转至博客:上海-悠悠 一.加载Chrome配置 chrome加载配置方法,只需改下面一个地方,username改成你电脑的名字(别用中文!!!) '--user-data-dir=C:\Users\u ...
- 实现类似微信聊天功能的mysql表设计
前言: 最近设计了一套聊天功能,此功能支持人对人聊天.发送图片.查看聊天记录.按时间展示聊天列表.最后一条聊天数据及未读消息数 下面分享一下表结构及实现逻辑: 表结构: 1.聊天主表 id(主键id) ...
- AC日记——逆序对 洛谷 P1908
逆序对 思路: 线段树水过: 代码: #include <cstdio> #include <cstring> #include <iostream> #inclu ...
- virgo-tomcat没有任务错误日志的停掉的解决办法
最近virgo-tomcat总是无缘无故的down掉,用了下面的几种方法来解决这个问题,具体哪个方法生效了,目前还不清楚...1. 删掉了home/logs下面的很大的日志文件 2. 在.bash_p ...
- HDU 6324.Problem F. Grab The Tree-博弈(思维) (2018 Multi-University Training Contest 3 1006)
6324.Problem F. Grab The Tree 题目看着好难,但是题解说的很简单,写出来也很简单.能想出来就是简单的,想不出来就难(讲道理,就算是1+1的题目,看不出来就是难的啊). 和后 ...
- POJ 2387 链式前向星下的SPFA
(POJ)[http://poj.org/problem?id=2387] Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K ...
- 让你的apache支持ipv6
如果你使用的linux系统已经获取到了ipv6地址,你就可以让你的apache htpd 等也支持ipv6. 1.检查linux监听的端口,如果有:::port ,而且获取到了ipv6地址,则可以确定 ...
- 1357:车厢调度(train)
[题目描述] 有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合.假设从A方向驶来的火车有n节(n≤1000),分别按照顺序编号为1,2,3,…,n.假定在进入车站 ...
- Hnoi2013题解 bzoj3139~3144
话说好久没写题(解)了.. 先贴份题解:http://wjmzbmr.com/archives/hnoi-2013-%E9%A2%98%E8%A7%A3/(LJ神题解..Lazycal表示看不懂..) ...
- 北京DAY1下午
省选模拟题 周子凯 题目概况 中文题目名 简易比特币 计算 路径 英文题目名 bit calculation Path 输入文件名 bit.in calculation.in path.in 输出文件 ...