Challenge 1: A Basic Coroutine — Possible Solution ==================================================================== import asyncio async def brew_coffee(): print("Brewing...") await asyncio.sleep(1) print("Coffee ready!") asyncio.run(brew_coffee()) Output (printed about 1 second apart): Brewing... Coffee ready! WHY THIS WORKS AS AN ANSWER ------------------------------ async def brew_coffee(): reuses this chapter's own say_hello() structure exactly — the async keyword marks this as a coroutine function, meaning calling brew_coffee() later will create a coroutine object rather than immediately running the body, per the chapter's explanation. print("Brewing...") runs first and immediately, since nothing has paused execution yet. await asyncio.sleep(1) reuses the chapter's own non-blocking sleep example — this pauses brew_coffee() specifically at this point and hands control back to the event loop for about 1 second, rather than blocking the entire program the way time.sleep() (Chapter 3) would. print("Coffee ready!") only runs after that await completes, so the two print statements are correctly separated by roughly a 1-second gap, in the same "prints something, awaits, prints something else" shape as the chapter's own say_hello() coroutine. asyncio.run(brew_coffee()) reuses the chapter's own top-level entry point exactly — this is what actually drives the coroutine to completion. Simply writing brew_coffee() alone, per the chapter's own warn-box, would create the coroutine object but never run any of its code at all.