消费者与生产者多线程之thread下Lock与Condition对比

本文通过Python的threading模块,使用Lock和Condition两种同步机制实现生产者消费者模型。演示了多个生产者线程与消费者线程如何在有限资源下协同工作,确保线程安全并有效利用资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lock版本:

import threading
import random
import time

gLock = threading.Lock()
ALL_MONEY = 1000
TIME_COUNT = 0


class producer(threading.Thread):
    def run(self):
        global ALL_MONEY
        global TIME_COUNT
        while True:
            money = random.randint(1000, 5000)
            gLock.acquire()
            if TIME_COUNT >= 10:
                gLock.release()
                break
            ALL_MONEY += money
            print("%s本次生产了%d元,总共还剩余%d元" % (threading.current_thread(), money, ALL_MONEY))
            TIME_COUNT += 1
            gLock.release()

            time.sleep(0.5)


class consumer(threading.Thread):
    def run(self):
        global ALL_MONEY
        global TIME_COUNT
        while True:
            money = random.randint(1000, 8000)
            gLock.acquire()
            if money <= ALL_MONEY:
                ALL_MONEY -= money
                print("%s本次消费了%d元,剩余%d元" % (threading.current_thread(), money, ALL_MONEY))
            else:
                if TIME_COUNT >= 10:
                    gLock.release()
                    break
                print("%s本次需要消费%d元,剩余金额不足" % (threading.current_thread(), money))
            gLock.release()
            time.sleep(0.5)


def main():
    for x in range(3):
        t = consumer(name="消费者线程%d" % x)
        t.start()

    for x in range(5):
        t = producer(name="生产者线程%d" % x)
        t.start()


if __name__ == '__main__':
    main()

Condition版本:

import threading
import random
import time

gCondition = threading.Condition()
ALL_MONEY = 1000
TIME_COUNT = 0

class producer(threading.Thread):
def run(self):
global ALL_MONEY, TIME_COUNT
while True:
money = random.randint(1000, 10000)
gCondition.acquire()
if TIME_COUNT >= 10:
gCondition.release()
break
ALL_MONEY += money
print("%s本次生产了%d元,总共还剩余%d元" % (threading.current_thread(), money, ALL_MONEY))
TIME_COUNT += 1
gCondition.notify_all()
gCondition.release()

        time.sleep(0.5)

class consumer(threading.Thread):
def run(self):
global ALL_MONEY
global TIME_COUNT
while True:
money = random.randint(1000, 5000)
gCondition.acquire()
“”" 此处需要用while来循环判断钱是否足够,如果用if,钱不足时当前进程暂停,
后面可能还有其他进程,当钱生产够了时,当前进行就排在其他进程后面,
可能等其他进程消耗之后,当前进程需要的钱再次不足,因此需要用while"""
while ALL_MONEY < money:
print("%s本次需要消费%d元,剩余金额不足" % (threading.current_thread(), money))
if TIME_COUNT >= 10:
gCondition.release()
return
gCondition.wait()
ALL_MONEY -= money
print("%s本次消费了%d元,剩余%d元" % (threading.current_thread(), money, ALL_MONEY))
gCondition.release()
time.sleep(0.5)

def main():
for x in range(3):
t = consumer(name=“消费者线程%d” % x)
t.start()

for x in range(5):
    t = producer(name="生产者线程%d" % x)
    t.start()

if name == ‘main’:
main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值