多线程-尊龙官方平台

多线程_生产者_消费者_锁lock_condition

el/2024/3/25 16:22:20
import threading
import random
import datetime"""
模拟3天的简易仓库存货和出货运营模式:每天售卖电脑时检查电脑仓库存储量是否小于100,小于的话去进行补货,随机生成一个补货单;大于等于100时,去进行售卖,随机生成用户订单,进行售卖。每天营业结束时,需要统计一天售卖的总金额和总数量
"""safety_stock = 100  # 安全库存
sale_times = 50  # 每天最大销售次数,超过就结束
price = 100  # 商品单价
stock = 90  # 当前库存
saled_times = 0  # 每天销售次数
total_sale_amount = 0  # 每天销售总金额
total_sale_count = 0  # 每天销售总数额
lock = threading.lock()class producer(threading.thread):  # threading.thread!!!def run(self):global stockglobal saled_timeswhile true:lock.acquire()if stock < safety_stock:# 补货,随机生成一个补货单,数量处理tmp = stockstock_in = random.randint(1, 10)stock  = stock_inprint("%s 当前库存:%s,应该生产,随机生成一个补货单: %s,补货:%d,库存为:%d"% (threading.current_thread(), tmp, create_order_id(), stock_in, stock))# lock.release()  # 放在这儿不行,为啥?if saled_times >= sale_times:lock.release()breaklock.release()class consumer(threading.thread):def run(self):global stockglobal total_sale_amountglobal total_sale_countglobal saled_timeswhile true:lock.acquire()if stock >= safety_stock:# 销售,随机生成用户订单,进行售卖tmp = stockstock_out = random.randint(1, 10)sale_amount = stock_out * pricestock -= stock_outtotal_sale_amount  = sale_amounttotal_sale_count  = stock_outsaled_times  = 1print("%s 当前库存:%s,应该销售,随机生成一个销售单: %s,销售:%d,销售额:%d,库存为:%d"% (threading.current_thread(), tmp, create_order_id(), total_sale_count, total_sale_amount, stock))if saled_times >= sale_times:# print("当天营业额:%s, 总销售数量:%s" % (total_sale_amount, total_sale_count))  # 放在这儿,每个线程都会执行一次lock.release()breaklock.release()def create_order_id():time_stamp = '{0:%y%m%d%h%m%s}'.format(datetime.datetime.now())order_id = time_stamp   str(random.randint(1000, 9999))return order_iddef main():# create 5 producersfor i in range(5):p = producer(name="生产者%d" % i)p.start()# create 3 consumersfor j in range(3):c = consumer(name="消费者%d" % j)c.start()p.join()c.join()# 每天营业结束时,需要统计一天售卖的总金额和总数量print("当天销售:%d, 销售额:%d" % (total_sale_count, total_sale_amount))if __name__ == '__main__':for i in range(1, 4):saled_times = 0print("\nday %d" % i)main()"""
模拟3天的简易仓库存货和出货运营模式:每天售卖电脑时检查电脑仓库存储量是否小于100,小于的话去进行补货,随机生成一个补货单;大于等于100时,去进行售卖,随机生成用户订单,进行售卖。每天营业结束时,需要统计一天售卖的总金额和总数量
condition版本模式
"""safety_stock = 100  # 安全库存
sale_times = 50  # 每天最大销售次数,超过就结束
price = 100  # 商品单价
stock = 90  # 当前库存
saled_times = 0  # 每天销售次数
total_sale_amount = 0  # 每天销售总金额
total_sale_count = 0  # 每天销售总数额
conditon = threading.condition()class producer(threading.thread):  # threading.thread!!!def run(self):global stockglobal saled_timeswhile true:conditon.acquire()if stock > safety_stock:conditon.wait()else:# 补货,随机生成一个补货单,数量处理tmp = stockstock_in = random.randint(1, 10)stock  = stock_inprint("%s 当前库存:%s,应该生产,随机生成一个补货单: %s,补货:%d,库存为:%d"% (threading.current_thread(), tmp, "123", stock_in, stock))# lock.release()  # 放在这儿不行,为啥?conditon.notify_all()if saled_times >= sale_times:conditon.release()breakconditon.release()class consumer(threading.thread):def run(self):global stockglobal total_sale_amountglobal total_sale_countglobal saled_timeswhile true:conditon.acquire()if stock < safety_stock:conditon.wait()else:# 销售,随机生成用户订单,进行售卖tmp = stockstock_out = random.randint(1, 10)sale_amount = stock_out * pricestock -= stock_outtotal_sale_amount  = sale_amounttotal_sale_count  = stock_outsaled_times  = 1print("%s 当前库存:%s,应该销售,随机生成一个销售单: %s,销售:%d,销售额:%d,库存为:%d"% (threading.current_thread(), tmp, "123", total_sale_count, total_sale_amount, stock))conditon.notify_all()if saled_times >= sale_times:# print("当天营业额:%s, 总销售数量:%s" % (total_sale_amount, total_sale_count))  # 放在这儿,每个线程都会执行一次conditon.release()breakconditon.release()def main():# create 5 producersfor i in range(5):p = producer(name="生产者%d" % i)p.start()# create 3 consumersfor j in range(3):c = consumer(name="消费者%d" % j)c.start()p.join()c.join()# 每天营业结束时,需要统计一天售卖的总金额和总数量print("当天销售:%d, 销售额:%d" % (total_sale_count, total_sale_amount))if __name__ == '__main__':# main()for i in range(1, 4):saled_times = 0print("\nday %d" % i)main()

http://www.ngui.cc/el/5126972.html

相关文章

python 版本、包管理相关note

1 将python3.7的所有安装包安装到python3.9 # 导出python3.7所有安装包 ~ % pip3.7 freeze > requirements.txt # requirements.txt 自定义 # 安装所有安装包到python3.9 ~ % pip3.9 install -r requirements.txt 2 ssl安全认证报错 报错: ssl.sslcertve…

mac 安装virtualenvwrapper后 执行命令mkvirtualenv 123-env,报错:zsh: command not found: mkvirtualenv

现象: ~ % mkvirtualenv 123-env zsh: command not found: mkvirtualenv 解决: 1、确认文件which virtualenvwrapper.sh的路径 /library/frameworks/python.framework/versions/3.9/bin/virtualenvwrapper.sh 2、mkdir ~…

ipad一张图应用系统

1. 系统概述 系统由两个部分组成:地图界面、菜单栏。 地图窗体:显示加载的地图数据,是进行数据浏览、查询,统计分析以及坐标采集的主要工作场所。 菜单栏:提供完成地图浏览、查询、统计分析以及坐标采集工作所需的各个功能选项。 2. 运行…

leetcode 刷题 -----删除无效括号(1)

给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。 返回所有可能的结果。答案可以按 任意顺序 返回。 示例 1: 输入:s "()())()" 输出:["(())()",&quo…

leetcode 刷题 ----- 重新排序得到 2 的幂(2)

题目描述: 给定正整数 n ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。 如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。 示例如下&…

leetcode 刷题 ----- 路径交叉(3)

提示: 1 < distance.length < 1051 < distance[i] < 105 问题分析: 1.首先考虑,当线条数小于4时,是不肯有交叉的。每一个线段为1,线段是只能根据东南西北四个方向走动的。 2.线段条数大于等于 4 时&…

leetcode 刷题 -----删除指定节点(7)

请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。 题目数据保证需要删除的节点 不是末尾节点 。 示例 1: 输入:head = [4,5,1,9], node = 5 输出:[4,1,9] 解释:指定链表中值为 5 的…

leetcode刷题----- 有效的完全平方数

给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。 进阶:不要 使用任何内置的库函数,如 sqrt 。 解题思路: 完全平方指用一个整数乘以自己例如1…

leetcode 刷题 -----最长定差子序列(11)

给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。 子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。 示例 1: 输入:arr = [1…

leetcode 刷题 ----丢失的数字(11)

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1: 输入:nums [3,0,1] 输出:2 解释:n 3,因为有 3 个数字,所以所有的数字都在范围 [0,…
网站地图