生产者、消费者问题,python实现
2015-06-12 10:30
561 查看
生产者、消费者问题,经典的线程同步问题:假设有一个缓冲池(列表),生产者往里面放东西,消费者从里面取,规则是:列表为空的时候,生产者才能放东西;列表不为空的时候,消费者才能取东西;为了简单起见,暂定缓冲池中最多只能有一个产品。这里生产者和消费者共同操作一个资源:缓冲池,因此每次操作的时候,需要给资源加锁,操作结束时,释放锁,这样才能做到资源同步。使用python实现,需要继承Thread类,获取锁对象,代码如下:
from threading import Thread
from threading import Lock
import time,random
pro_list = []
lock = Lock()
class Producer(Thread):
def run(self):
global pro_list
while True:
i = random.randint(0, 100)
lock.acquire()
if len(pro_list) > 0:
print "!--product still in list, wait consumer to get it.."
else:
pro_list.append(i)
print ":::Producer put:", pro_list[0]
lock.release()
time.sleep(2)
class Consumer(Thread):
def run(self):
global pro_list
while True:
lock.acquire()
if len(pro_list) == 0:
print "!--No product now, wait producer put in..."
else:
print ":::Consumer fetch:", pro_list[0]
pro_list.pop(0)
lock.release()
time.sleep(2)
Producer().start()
Producer().start()
Consumer().start()
Producer().start()
Producer().start()
Consumer().start()
Consumer().start()
这里使用多个生产者和消费者,共同操作缓冲池,部分执行结果如下:
:::Producer put: 12
!--product still in list, wait consumer to get it..
:::Consumer fetch: 12
:::Producer put: 75
!--product still in list, wait consumer to get it..
:::Consumer fetch: 75
!--No product now, wait producer put in...
:::Producer put: 28
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..
:::Consumer fetch: 28
:::Producer put: 94
:::Consumer fetch: 94
from threading import Thread
from threading import Lock
import time,random
pro_list = []
lock = Lock()
class Producer(Thread):
def run(self):
global pro_list
while True:
i = random.randint(0, 100)
lock.acquire()
if len(pro_list) > 0:
print "!--product still in list, wait consumer to get it.."
else:
pro_list.append(i)
print ":::Producer put:", pro_list[0]
lock.release()
time.sleep(2)
class Consumer(Thread):
def run(self):
global pro_list
while True:
lock.acquire()
if len(pro_list) == 0:
print "!--No product now, wait producer put in..."
else:
print ":::Consumer fetch:", pro_list[0]
pro_list.pop(0)
lock.release()
time.sleep(2)
Producer().start()
Producer().start()
Consumer().start()
Producer().start()
Producer().start()
Consumer().start()
Consumer().start()
这里使用多个生产者和消费者,共同操作缓冲池,部分执行结果如下:
:::Producer put: 12
!--product still in list, wait consumer to get it..
:::Consumer fetch: 12
:::Producer put: 75
!--product still in list, wait consumer to get it..
:::Consumer fetch: 75
!--No product now, wait producer put in...
:::Producer put: 28
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..
:::Consumer fetch: 28
:::Producer put: 94
:::Consumer fetch: 94
相关文章推荐
- Python 学习笔记5
- 用python设计的一个小游戏
- Python2中的raw_input() 与 input()
- Windows下实现Python2和Python3两个版共存的方法
- Python3中的2to3转换工具使用示例
- Python中unittest模块做UT(单元测试)使用实例
- Python学习笔记 -- 序列(四)元组
- 初步了解python
- 搞笑的程序猿:看看你是哪种Python程序员
- 用python操作浏览器的两种方式
- python对目录的操作
- Python 3.x 新特性及10大变化
- 提高Python运行效率的六个窍门
- 跟Tovi学Python3.x(一)
- Python实现比较两个列表(list)范围
- wxpython无标题窗口最大化解决方案
- Python 扩展
- Python实现比较两个列表(list)范围
- Python 3.x 新特性及10大变化
- 搞笑的程序猿:看看你是哪种Python程序员