python

超轻量级php框架startmvc

Python实现的生产者、消费者问题完整实例

更新时间:2020-06-04 05:30:01 作者:startmvc
本文实例讲述了Python实现的生产者、消费者问题。分享给大家供大家参考,具体如下:生产

本文实例讲述了Python实现的生产者、消费者问题。分享给大家供大家参考,具体如下:

生产者、消费者问题,经典的线程同步问题:假设有一个缓冲池(列表),生产者往里面放东西,消费者从里面取,规则是:列表为空的时候,生产者才能放东西;列表不为空的时候,消费者才能取东西;为了简单起见,暂定缓冲池中最多只能有一个产品。这里生产者和消费者共同操作一个资源:缓冲池,因此每次操作的时候,需要给资源加锁,操作结束时,释放锁,这样才能做到资源同步。使用python实现,需要继承Thread类,获取锁对象,代码如下:


# -*- coding:utf-8 -*-
#! python2
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: 78 !--product still in list, wait consumer to get it.. :::Consumer fetch: 78 :::Producer put: 99 !--product still in list, wait consumer to get it.. :::Consumer fetch: 99 !--No product now, wait producer put in... :::Producer put: 12 :::Consumer fetch: 12 :::Producer put: 91 !--product still in list, wait consumer to get it.. !--product still in list, wait consumer to get it.. :::Consumer fetch: 91 !--No product now, wait producer put in... :::Producer put: 63 :::Consumer fetch: 63 :::Producer put: 85 !--product still in list, wait consumer to get it.. !--product still in list, wait consumer to get it.. :::Consumer fetch: 85 !--No product now, wait producer put in... :::Producer put: 1 :::Consumer fetch: 1 :::Producer put: 26 !--product still in list, wait consumer to get it.. !--product still in list, wait consumer to get it.. :::Consumer fetch: 26 !--No product now, wait producer put in... :::Producer put: 8 :::Consumer fetch: 8 :::Producer put: 19 !--product still in list, wait consumer to get it.. !--product still in list, wait consumer to get it.. :::Consumer fetch: 19 !--No product now, wait producer put in... :::Producer put: 74 !--product still in list, wait consumer to get it.. :::Consumer fetch: 74 :::Producer put: 50 !--product still in list, wait consumer to get it.. :::Consumer fetch: 50 !--No product now, wait producer put in... :::Producer put: 97 :::Consumer fetch: 97 :::Producer put: 69 !--product still in list, wait consumer to get it.. !--product still in list, wait consumer to get it.. :::Consumer fetch: 69 !--No product now, wait producer put in... :::Producer put: 41 !--product still in list, wait consumer to get it.. :::Consumer fetch: 41 :::Producer put: 6 !--product still in list, wait consumer to get it.. :::Consumer fetch: 6 !--No product now, wait producer put in...

Python 生产者 消费者 问题