In the earlier sections of this chapter, we learned about coroutines, data exchange between coroutine tasks, and asynchronization. We had a look at using a future to wait for a single value or an asynchronous iterator, which may well use futures internally to wait for a sequence of values. We also looked at tools that we can use to transmit data to and from asynchronous coroutine tasks and force synchronization on them when necessary.
Now we've seen how to get a payoff from coroutines and asynchronization using these tools to write a network client or server. In the next chapter, we'll look at various parts of Python that can be redefined within our program source code and how to use them.