您的位置:首页 > 编程语言 > Python开发

生产者、消费者问题,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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: