有一家店铺里有4个销售和2个搬运工,销售负责卖货,搬运工负责从仓库搬货物,已知该店铺的存货有size,当销售或搬运工做完所有商品数量后,他们各自就可以下班。销售可以同时卖货,但只能按照货架顺序每次卖出一件,搬运工一次可以搬满货架,货架容量为5个货物。当货架商品销售完后,搬运工会去仓库搬运货物进行补货,销售此时进行小憩;当货架补满后,销售开始销售商品,搬运工进行休息。
本题要求实现搬运工Porter类和销售Seller类,他们都是线程类。
提示:本题需要使用Condition类来保证销售不会乱卖商品,保证搬运工不会在商品未销售完时搬运货物。
裁判测试程序样例:
from threading import Thread, Condition# ***************# 你编写的类将放在这# ***************size = int(input())
Porter.size = Seller.size = size
condi = Condition()
shelves = []for _ in range(2):Porter().start()for _ in range(4):Seller().start()
输入样例:
在这里给出一组输入。例如:
20
输出样例:
在这里给出相应的输出。例如:
已生产商品: 1 2 3 4 5
已销售商品: 1
已销售商品: 2
已销售商品: 3
已销售商品: 4
已销售商品: 5
已生产商品: 1 2 3 4 5
已销售商品: 1
已销售商品: 2
已销售商品: 3
已销售商品: 4
已销售商品: 5
已生产商品: 1 2 3 4 5
已销售商品: 1
已销售商品: 2
已销售商品: 3
已销售商品: 4
已销售商品: 5
已生产商品: 1 2 3 4 5
已销售商品: 1
已销售商品: 2
已销售商品: 3
已销售商品: 4
已销售商品: 5
class Porter(Thread):def run(self):global shelvescondi.acquire()while Porter.size > 0:if len(shelves) >= 5:condi.notify()condi.wait()else:if len(shelves) <= 0:print("已生产商品:",end='')shelves.append(6)Porter.size -= 1if len(shelves) >=5 or Porter.size <= 0:print(f" {len(shelves)}")else:print(f" {len(shelves)}",end = '')condi.notify()condi.release()class Seller(Thread):def run(self):global shelves,tps,nwith condi:while len(shelves) > 0 or Seller.size > 0:if len(shelves) <= 0:condi.notify()condi.wait()else:del shelves[0]Seller.size -= 1if Seller.size == len(shelves) and n == 0:tps = len(shelves) + 1n = 1print(f"已销售商品: {tps - len(shelves)}",end = '')if Seller.size > 0:print()tps = 5
n = 0