[Python-Dev] Importance of "async" keyword

Steven D'Aprano steve at pearwood.info
Thu Jun 25 04:16:59 CEST 2015

On Wed, Jun 24, 2015 at 11:21:54PM +0200, Sven R. Kunze wrote:
> Thanks, Yury, for you quick response.
> On 24.06.2015 22:16, Yury Selivanov wrote:
> >Sven, if we don't have 'async def', and instead say that "a function 
> >is a *coroutine function* when it has at least one 'await' 
> >expression", then when you refactor "useful()" by removing the "await" 
> >from it, it stops being a *coroutine function*, which means that it 
> >won't return an *awaitable* anymore.  Hence the "await useful()" call 
> >in the "important()" function will be broken.
> I feared you would say that. Your reasoning assumes that *await* needs 
> an *explicitly declared awaitable*.
> Let us assume for a moment, we had no async keyword. So, any awaitable 
> needs to have at least 1 await in it. Why can we not have awaitables 
> with 0 awaits in them?

I haven't been following the async discussion in detail, but I would 
expect that the answer is for the same reason that you cannot have a 
generator function with 0 yields in it.

> >'async def' guarantees that function always return a "coroutine"; it 
> >eliminates the need of using @asyncio.coroutine decorator (or 
> >similar), which besides making code easier to read, also improves the 
> >performance.  Not to mention new 'async for' and 'async with' statements.
> Recently, I read Guido's blog about the history of Python and how he 
> eliminated special cases from Python step by step. As I see it, the same 
> could be done here.
> What is the difference of a function (no awaits) or an awaitable (> 1 
> awaits) from an end-user's perspective (i.e. the programmer)?

The first is syncronous, the second is asyncronous. 

> My answer would be: none. When used the same way, they should behave in 
> the same manner. As long as, we get our nice tracebacks when something 
> went wrong, everything seems find to me.

How is that possible?

def func():
    # Simulate a time consuming calculation.
    return 42

# Call func syncronously, blocking until the calculation is done:
x = func()
# Call func asyncronously, without blocking:
y = func()

I think that one of us is missing something here. As I said, I haven't 
followed the whole discussion, so it might be me. But on face value, I 
don't think what you say is reasonable.

> >P.S. This and many other things were discussed at length on the 
> >mailing lists, I suggest you to browse through the archives.
> I can imagine that. As said I went through of some of them, but it could 
> be that I missed some of them as well.
> Is there a way to search them through (by not using Google)?

You can download the mailing list archive for the relevant months, and 
use your mail client to search them.


More information about the Python-Dev mailing list