有一家店铺里有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 shelves
condi.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 -= 1
if 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,n
with condi:
while len(shelves) > 0 or Seller.size > 0:
if len(shelves) <= 0:
condi.notify()
condi.wait()
else:
del shelves[0]
Seller.size -= 1
if Seller.size == len(shelves) and n == 0:
tps = len(shelves) + 1
n = 1
print(f"已销售商品: {tps - len(shelves)}",end = '')
if Seller.size > 0:
print()
tps = 5
n = 0
?