import asyncio import random from kitchen_serial import parse_args async def do_work(duration, result): t = random.uniform(duration/5 * 0.5, duration/5 * 1.5) await asyncio.sleep(t) return result async def fetch_olive_oil(): print('Fetching olive oil…') return await do_work(5, 'oil') async def fetch_dako_rusk(): print('Fetching dako rusk…') return await do_work(5, 'rusk') async def fetch_tomato(): print('Fetching tomato…') return await do_work(3, 'tomato') async def fetch_feta(): print('Fetching feta…') return await do_work(3, 'feta') async def chop_tomato(tomato): assert tomato == 'tomato' print('Chopping tomato…') return await do_work(1, f'chopped {tomato}') async def water_rusk(rusk): assert rusk == 'rusk' print('Watering rusk…') return await do_work(0.2, f'wet {rusk}') async def oil_rusk(rusk, oil): assert rusk == 'wet rusk' assert oil == 'oil' print(f'Pouring {oil} on {rusk}…') return await do_work(0.5, f'{rusk} with {oil}') async def decorate_rusk(rusk, *toppings): result = rusk for topping in toppings: print(f'Putting {topping} on {result}…') result = await do_work(1, f'{result} with {topping}') return result async def store_dako(dako): print(f'Storing {dako}') await do_work(1, None) async def prepare_dako(): print('Making dako…') oil = await fetch_olive_oil() rusk = await fetch_dako_rusk() tomato = await fetch_tomato() tomato = await chop_tomato(tomato) rusk = await water_rusk(rusk) rusk = await oil_rusk(rusk, oil) feta = await fetch_feta() dako = await decorate_rusk(rusk, tomato, feta) await store_dako(dako) print(f'{dako} is ready!') async def prepare_dakos(n_dakos): for n in range(args.n_dakos): await prepare_dako() if __name__ == '__main__': args = parse_args() asyncio.run( prepare_dakos(args.n_dakos) )