[Python-ideas] Learning from the shell in supporting asyncio background calls
Nick Coghlan
ncoghlan at gmail.com
Sat Jul 11 06:33:24 CEST 2015
On 10 July 2015 at 21:48, Oscar Benjamin <oscar.j.benjamin at gmail.com> wrote:
> Why is that better than something like:
>
> data1, data2 = asyncio.run([future1, future2])
>
> IIUC your proposal is that run_in_background adds the tasks to an
> implicit global variable.
It just schedules them normally using
asyncio.get_event_loop().create_task() (or run_in_executor if you pass
in a callable).
For folks that don't want to click through to the blog post (which has
a full worked example using asynchronous timers), the full
implementations of the two functions (with a slight tweak to
run_in_background to make the executor configurable as well) are:
def run_in_background(target, *, loop=None, executor=None):
if loop is None:
loop = asyncio.get_event_loop()
try:
return asyncio.ensure_future(target, loop=loop)
except TypeError:
pass
if callable(target):
return loop.run_in_executor(executor, target)
raise TypeError("background task must be future, coroutine or "
"callable, not {!r}".format(type(target)))
def run_in_foreground(task, *, loop=None):
if loop is None:
loop = asyncio.get_event_loop()
return loop.run_until_complete(asyncio.ensure_future(task))
> Then the first call to run_in_foreground
> runs both tasks returning when future1 is ready. At that point it
> suspends future2 if incomplete? Then the second call to
> run_in_foreground returns immediately if future2 is ready or otherwise
> runs that task until complete?
No, it's all driven by the main asyncio event loop - the suggested
functions are relatively thin shims designed to let people make
effective use of asyncio with just the POSIX shell foreground &
background task mental model, rather than having to learn how asyncio
*really* works in order to benefit from it.
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
More information about the Python-ideas
mailing list