修改以上代码,能一直运行下去
时间: 2023-12-14 14:03:26 浏览: 169
为了让代码能一直运行下去,可以使用一个while循环来包裹整个程序,如果出现异常就捕获并打印异常信息,然后继续循环。同时可以添加一个退出机制,比如输入某个字符或者按下某个键时程序退出。
修改后的代码如下:
```python
import threading
import time
def producer(name):
global mantou
while True:
try:
if psem.acquire():
mutex.acquire()
if empty.acquire():
mantou += 1
basket.append(mantou)
print('糕点师%s做了第%s个面包,橱窗现有%s个面包' % (name, mantou, len(basket)))
full.release()
else:
print('橱窗放不下了,稍等...')
mutex.release()
psem.release()
else:
print('生产者不够了,稍等...')
time.sleep(0.3)
except Exception as e:
print('producer error:', e)
def consumer(name):
while True:
try:
if csem.acquire():
mutex.acquire()
if full.acquire():
print('消费者%s吃了第%s个面包,橱窗还剩%s个面包' % (name, basket.pop(),len(basket)))
empty.release()
else:
print('面包还没有做好,稍等...')
mutex.release()
csem.release()
else:
print('当前消费者过多,稍等...')
time.sleep(0.3)
except Exception as e:
print('consumer error:', e)
mutex = threading.Semaphore(1) # 互斥信号量,同一时间只能有一个线程访问临界资源
psem = threading.Semaphore(5) # 同步信号量,同一时间只能有5个生产者线程工作
csem = threading.Semaphore(5) # 同步信号量,同一时间只能服务5个消费者
empty = threading.Semaphore(5) # 空位信号量
full = threading.Semaphore(0) # 满位信号量
basket = [] # 缓冲池 装面包的橱窗
mantou = 0 # 面包
basket_SIZE=5
def main():
threads = []
for i in range(5):
p = threading.Thread(target=producer, args=(i + 1,))
threads.append(p)
p.start()
for i in range(5):
c = threading.Thread(target=consumer, args=(i + 1,))
threads.append(c)
c.start()
while True:
try:
if input('输入q退出程序:') == 'q':
break
except Exception:
pass
time.sleep(0.5)
print('程序已退出')
if __name__ == '__main__':
main()
```
这样,程序就可以一直运行下去,同时也可以通过输入q退出程序。
阅读全文