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

[代码笔记] python 之 多线程同步锁 threading.Lock

2016-12-23 10:06 543 查看

单消费者,单生产者问题

#!python
#文件名: demo_thread_lock.py
#实现了:
#   一个生产者(为resource赋值)后,另一个消费者淡定取走resource
#   整个过程必须同步,即实现生产一个,才消费一个,且生产与消费同步进行

import threading,time

#定义资源类(模拟消费物品)
class Resource:

def __init__(self,flag):
self.flag=flag

__name=''
__sex=''
flag=0#用于判断 轮到谁执行(即可以生产或者可以消费一个资源)

def setName(self,name):
self.__name=name

def setSex(self,sex):
self.__sex=sex

def getName(self):
return self.__name

def getSex(self):
return self.__sex

#线程类
class MyThread(threading.Thread):

resource=''

def __init__(self,resource,flag):
threading.Thread.__init__(self)
self.resource=resource
self.flag=flag

#执行方法:
def run(self):
count=0
while 1:#不停的生产,也可以指定一个数量
lock.acquire()#加锁,同步,确保每生产完的东西不会被消费
if self.flag:#消费线程
if self.resource.flag:#判断是否有物品给我消费
print('Name: %s, Sex: %s'%(self.resource.getName(),self.resource.getSex()) )
self.resource.flag=0#消费结束修改标识,让生产线程可以生产物品
else:#生产进程
if not self.resource.flag:#判断是否可以生产了
self.resource.setName('Test_'+ str(count) )
sex=''
if count%2==0:
sex='男'
else:
sex='女'
self.resource.setSex(sex)
self.resource.flag=1#修改标识,让消费线程可以消费物品
count+=1
lock.release()#进程单次操作资源结束,释放锁

#创建一个锁
lock=threading.Lock()
r=Resource(0)

t1=MyThread(r,0)#创建一个生产线程
t2=MyThread(r,1)#创建一个消费线程

#前方高能,注意关闭窗口
t1.start()
t2.start()

#等待线程结束? 仅在控制生产数量是等待有效(可预期时长)
t1.join()
t2.join()

print('主线程结束了')


打印如下:(妈的控制台走的太快,没没截取到开头)

注意_单数的名字性别为女, 性别没乱则对

Name: Test_580, Sex: 男

Name: Test_581, Sex: 女

Name: Test_582, Sex: 男

Name: Test_583, Sex: 女

Name: Test_584, Sex: 男

Name: Test_585, Sex: 女

Name: Test_586, Sex: 男

Name: Test_587, Sex: 女

Name: Test_588, Sex: 男

Name: Test_589, Sex: 女

Name: Test_590, Sex: 男

Name: Test_591, Sex: 女

Name: Test_592, Sex: 男

Name: Test_593, Sex: 女

Name: Test_594, Sex: 男

Name: Test_595, Sex: 女

Name: Test_596, Sex: 男

Name: Test_597, Sex: 女

Name: Test_598, Sex: 男

Name: Test_599, Sex: 女

Name: Test_600, Sex: 男

Name: Test_601, Sex: 女

Name: Test_602, Sex: 男

Name: Test_603, Sex: 女

Name: Test_604, Sex: 男

Name: Test_605, Sex: 女

Name: Test_606, Sex: 男

Name: Test_607, Sex: 女

Name: Test_608, Sex: 男

Name: Test_609, Sex: 女

Name: Test_610, Sex: 男

Name: Test_611, Sex: 女

Name: Test_612, Sex: 男

Name: Test_613, Sex: 女

Name: Test_614, Sex: 男

Name: Test_615, Sex: 女

Name: Test_616, Sex: 男

Name: Test_617, Sex: 女

Name: Test_618, Sex: 男

Name: Test_619, Sex: 女

Name: Test_620, Sex: 男

Name: Test_621, Sex: 女

Name: Test_622, Sex: 男

Name: Test_623, Sex: 女

Name: Test_624, Sex: 男

Name: Test_625, Sex: 女

Name: Test_626, Sex: 男

Name: Test_627, Sex: 女

Name: Test_628, Sex: 男

Name: Test_629, Sex: 女
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: