They're totally different. async() is for those cases where you have something that's either a coroutine or a Future and what you need is a Future (e.g. because you want to add a callback). It will return the Future unchanged but wrap the coroutine in a Task. (Note that Task subclasses Future so a Task will also be returned unchanged.)
OTOH create_task() *always* creates a new Task, and the argument must *always* be a coroutine. It is *nearly* the same as just using Task() -- the difference is that create_task() may be overridden by certain EventLoop subclasses to return a task that behaves better with some other framework (e.g. Tornado). Also note that async() calls create_task(), but only when it decides to create a new task. Maybe the docs need an upgrade, please submit a patch. On Sun, Mar 22, 2015 at 7:32 AM, Luciano Ramalho <luci...@ramalho.org> wrote: > I understand these do almost the same thing, and asyncio.async can > even get a loop keyword argument so it's as flexible as > loop.create_task, which it uses internally. > > So my question is: are both being kept going forward, or is this > redundancy just a temporary compatibility measure before asyncio.async > is deprecated? > > The docs seem to imply ever-so-slightly that create_task is better and > async should be used "to support also older Python versions". > > Cheers, > > Luciano > > -- > Luciano Ramalho > | Author of Fluent Python (O'Reilly, 2015) > | http://shop.oreilly.com/product/0636920032519.do > | Professor em: http://python.pro.br > | Twitter: @ramalhoorg > -- --Guido van Rossum (python.org/~guido)