On Mon, Nov 28, 2016 at 10:42 PM, Chris Angelico <ros...@gmail.com> wrote: > On Tue, Nov 29, 2016 at 4:13 PM, Paul Rubin <no.email@nospam.invalid> wrote: >> >> I haven't gotten my head around Python asyncio and have been wanting >> to read this: >> >> http://lucumr.pocoo.org/2016/10/30/i-dont-understand-asyncio/ > > It's talking a lot about how we got here, which isn't all necessary if > you just want to give asyncio a whirl. The conclusion at the end says > that you should just use 'async def' and not bother with all the older > forms, which I agree with (subject to the usual caveat that this > implies no support for older Pythons). > > There's one thing that I really struggle with, though, and that's that > there's no easy and obvious way to demonstrate the lowest level of > operation. If "await x()" is like "yield from x()", how do you do the > innermost "yield" that actually does something? I have the same > confusion with Node.js, too. It's as if async primitives can't be > implemented in application code at all, they just have to be given to > you. Certainly it's not something made clear anywhere in the docs that > I've found.
You mean how do you create something that can be awaited that doesn't await something else in turn? With a Future. import asyncio class Awaitable(asyncio.Future): def wake_up_later(self): asyncio.get_event_loop().call_later(3, self.set_result, 42) async def main(): awaitable = Awaitable() awaitable.wake_up_later() print(await awaitable) asyncio.get_event_loop().run_until_complete(main()) The trick is in arranging for the future's result to be set. For I/O events you would typically do that by associating a callback with a file descriptor on the event loop: https://docs.python.org/3/library/asyncio-eventloop.html#watch-file-descriptors If you need to do something particulary abstruse you can always write a custom Selector or event loop: https://docs.python.org/3/library/selectors.html#module-selectors https://docs.python.org/3/library/asyncio-eventloop.html#base-event-loop -- https://mail.python.org/mailman/listinfo/python-list