Maybe it's me not grokking async, but the code seems right to me. `once` is a decorator, so `future` is "instantiated" once per decorated function, which is then accessed as nonlocal in the wrapper. So in the last code sample, every call to `one_time_setup()` is accessing the same `future`.
- Chris forgot to declare the variable as global;
- Chris used asyncio.create_task() instead of asyncio.ensure_future().