Python零基础之生产者和消费者线程交互

1. 功能需求

  • 由生产者进行生产
  • 由消费者进行消费
  • 消费者消费金额不能大于余额
  • 生产10次以后不再生产
  • 当余额小于消费金额且生产次数达到10次后,就不再消费

2. Lock版生产者和消费者

# !/usr/bin/python
# Filename: Lock版的生产者和消费者.py
# Data    : 2020/08/15
# Author  : --king--
# ctrl+alt+L自动加空格格式化


import threading
import random
import time

gMoney = 0
# 定义一个变量 保存生产的次数
gTimes = 0

# 定义一把锁,用来防止对全局变量的访问冲突
gLock = threading.Lock()

# 定义生产者
class Producer(threading.Thread):

    def run(self) -> None:

        global gMoney
        global gTimes

        while True:
            gLock.acquire()
            # 加锁

            if gTimes >= 10:

                # break后的代码不执行,所以要解锁,否则会阻塞
                gLock.release()

                break

            money = random.randint(0, 100)
            gMoney += money
            gTimes += 1

            print('%s生产了%d元钱' % (threading.current_thread().name, money))
            gLock.release() # 解锁
            time.sleep(1)

# 定义消费者
class Consumer(threading.Thread):

    def run(self) -> None:
        global gMoney

        while True:
            gLock.acquire()  # 加锁
            money = random.randint(0, 100)
            if gMoney >= money:
                gMoney -= money
                # 获取当前线程名
                # threading.current_thread().name
                print('%s消费了%d元钱' % (threading.current_thread().name,money))
            else:
                if gTimes >= 10:

                    gLock.release()
                    break

                print('%s消费了%d元钱,但余额为%d,余额不足' % (threading.current_thread().name,money,gMoney))
            gLock.release()  # 解锁
        time.sleep(1)

def main():
    # 开启5个生产者
    for i in range(5):
        th = Producer(name='生产者%d号' % i)
        th.start()

    # 开启5个消费者
    for i in range(5):
        th = Consumer(name='消费者%d号' % i)
        th.start()


if __name__ == '__main__':
    main()

3. Condition版生产者和消费者

# !/usr/bin/python
# Filename: Condition版的生产者和消费者.py
# Data    : 2020/08/15
# Author  : --king--
# ctrl+alt+L自动加空格格式化


import threading
import random
import time

gMoney = 0
# 定义一个变量 保存生产的次数
gTimes = 0

# 定义一把锁,用来防止对全局变量的访问冲突
gCond = threading.Condition()

# 定义生产者
class Producer(threading.Thread):

    def run(self) -> None:

        global gMoney
        global gTimes

        while True:
            gCond.acquire()
            # 加锁

            if gTimes >= 10:

                # break后的代码不执行,所以要解锁,否则会阻塞
                gCond.release()

                break

            money = random.randint(0, 100)
            gMoney += money
            gTimes += 1

            print('%s生产了%d元钱,剩余%d元' % (threading.current_thread().name, money,gMoney))
            # 通知所有消费者有钱了
            gCond.notifyAll()
            gCond.release() # 解锁
            time.sleep(1)

# 定义消费者
class Consumer(threading.Thread):

    def run(self) -> None:
        global gMoney

        while True:
            gCond.acquire()  # 加锁
            money = random.randint(0, 100)
            while money >= gMoney:

                if gTimes >= 10:
                    gCond.release()
                    return

                print('%s消费了%d元钱,但是余额为%d元钱,生产者也不再生成了' % (threading.current_thread().name, money,gMoney))
                gCond.wait()

            gMoney -= money
            print('%s消费了%d元钱,剩余%d元' % (threading.current_thread().name, money,gMoney))
            gCond.release()  # 解锁
            time.sleep(1)

def main():
    # 开启5个生产者
    for i in range(5):
        th = Producer(name='生产者%d号' % i)
        th.start()

    # 开启5个消费者
    for i in range(5):
        th = Consumer(name='消费者%d号' % i)
        th.start()


if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kingx3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值