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

单消费者,单生产者问题

#!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: 女

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值