Sanitized Table of Contents
├── (1) Chapter 1. Introducing Asyncio (Pages: 13-20)
│   ├── (1.1) The Restaurant of ThreadBots (Pages: 13-17)
│   ├── (1.2) Epilogue (Pages: 18-17)
│   └── (1.3) What Problem Is Asyncio Trying to Solve? (Pages: 18-20)
├── (2) Chapter 2. The Truth About Threads (Pages: 21-32)
│   ├── (2.1) Benefits of Threading (Pages: 22-22)
│   ├── (2.2) Drawbacks of Threading (Pages: 23-25)
│   └── (2.3) Case Study: Robots and Cutlery (Pages: 26-32)
├── (3) Chapter 3. Asyncio Walk-Through (Pages: 33-86)
│   ├── (3.1) Quickstart (Pages: 34-39)
│   ├── (3.2) The Tower of Asyncio (Pages: 40-42)
│   ├── (3.3) Coroutines (Pages: 43-48)
│   │   ├── (3.3.1) The New async def Keywords (Pages: 44-45)
│   │   └── (3.3.2) The New await Keyword (Pages: 46-48)
│   ├── (3.4) Event Loop (Pages: 49-50)
│   ├── (3.5) Tasks and Futures (Pages: 51-57)
│   │   └── (3.5.1) Create a Task? Ensure a Future? Make Up Your Mind! (Pages: 54-57)
│   ├── (3.6) Async Context Managers: async with (Pages: 58-61)
│   │   └── (3.6.1) The contextlib Way (Pages: 59-61)
│   ├── (3.7) Async Iterators: async for (Pages: 62-64)
│   ├── (3.8) Simpler Code with Async Generators (Pages: 65-66)
│   ├── (3.9) Async Comprehensions (Pages: 67-68)
│   └── (3.10) Starting Up and Shutting Down (Gracefully!) (Pages: 69-86)
│       ├── (3.10.1) What Is the return_exceptions=True for in gather()? (Pages: 73-74)
│       ├── (3.10.2) Signals (Pages: 75-79)
│       └── (3.10.3) Waiting for the Executor During Shutdown (Pages: 80-86)
├── (4) Chapter 4. 20 Asyncio Libraries You Aren’t Using (But…Oh, Never Mind) (Pages: 87-140)
│   ├── (4.1) Streams (Standard Library) (Pages: 88-99)
│   │   ├── (4.1.1) Case Study: A Message Queue (Pages: 88-95)
│   │   └── (4.1.2) Case Study: Improving the Message Queue (Pages: 96-99)
│   ├── (4.2) Twisted (Pages: 100-102)
│   ├── (4.3) The Janus Queue (Pages: 103-103)
│   ├── (4.4) aiohttp (Pages: 104-109)
│   │   ├── (4.4.1) Case Study: Hello World (Pages: 105-104)
│   │   └── (4.4.2) Case Study: Scraping the News (Pages: 105-109)
│   ├── (4.5) ØMQ (ZeroMQ) (Pages: 110-121)
│   │   ├── (4.5.1) Case Study: Multiple Sockets (Pages: 111-113)
│   │   └── (4.5.2) Case Study: Application Performance Monitoring (Pages: 114-121)
│   ├── (4.6) asyncpg and Sanic (Pages: 122-137)
│   │   └── (4.6.1) Case Study: Cache Invalidation (Pages: 127-137)
│   └── (4.7) Other Libraries and Resources (Pages: 138-140)
└── (5) Chapter 5. Concluding Thoughts (Pages: 141-142)
