Python同步异步问题三:一个小错误而可能造成无法营业
上一篇我们解决了职责不明的问题。
本文解决:有一道菜错误而整个套餐都无法上菜的问题。
一、问题
热菜过期,造成整个套餐都无法上菜。
import asyncio
import timeasync def cooking(chef, name ,during,faulty_recipe):if faulty_recipe:raise ValueError(f"{name} 的食材过期了")print(chef,"开始做",name)await asyncio.sleep(during)print(name,"好了")async def main():await asyncio.gather(cooking("小王", "凉拌黄瓜", 2,False),cooking("小李", "西湖醋鱼", 5,True),cooking("小张", "紫菜蛋花汤", 3,False))print("套餐全部做好了")if __name__ == '__main__':begin_time = time.time()asyncio.run(main())end_time = time.time()print("套餐耗时:", round((end_time - begin_time),2),"分钟")
二、解决办法
使用return_exceptions解决
import asyncio
import timeasync def cooking(chef, name ,during,faulty_recipe):if faulty_recipe:raise ValueError(f"{name} 的食材过期了")print(chef,"开始做",name)await asyncio.sleep(during)print(name,"好了")async def main():results = await asyncio.gather(cooking("小王", "凉拌黄瓜", 2,False),cooking("小李", "西湖醋鱼", 5,True),cooking("小张", "紫菜蛋花汤", 3,False),return_exceptions=True)faulty_recipe_count = 0for result in results:if isinstance(result, Exception):faulty_recipe_count += 1print("一共做了",len(results),"个菜,其中过期了",faulty_recipe_count,"个菜,该菜不能上")if faulty_recipe_count > 0:print("套餐菜品未上齐,给顾客3折优惠")if __name__ == '__main__':begin_time = time.time()asyncio.run(main())end_time = time.time()print("套餐耗时:", round((end_time - begin_time),2),"分钟")
三、管理视角:风险管理与应急预案
作为管理者,你需要预见可能的风险,并制定相应的应急预案。通过提前准备,可以最大限度地降低突发事件带来的损失。
- 风险识别:识别潜在的风险点,并评估其影响程度。
- 应急预案:为关键环节制定应急预案,确保在出现问题时能够迅速响应。