Python asyncio: return vs set_result -


hello asyncio experts,

how correctly return results coroutine? need use return or future.set_result?

for example:

@coroutine def do_something()     result = yield some_function()     return result 

or

@coroutine def do_something()     future = asyncio.future()     result = yield some_function()     future.set_result(result) 

you should use return result. second example end returning none, rather result. here's complete example demonstrating that:

from asyncio import coroutine import asyncio  @asyncio.coroutine def some_function():     yield asyncio.sleep(.5)     return 5  @coroutine def do_something():     result = yield some_function()     return result   @coroutine def do_something_else():     future = asyncio.future()     result = yield some_function()     future.set_result(result)  @coroutine def main():     print((yield do_something()))     print((yield do_something_else()))  loop = asyncio.get_event_loop() loop.run_until_complete(main()) 

output:

5 none 

note become equivalent caller's perspective if return future do_something_else:

@coroutine def do_something_else():     future = asyncio.future()     result = yield some_function()     future.set_result(result)     return future # yield do_something_else() returns 5. 

but it's unnecessary work when can return result directly.

in vast majority of cases, coroutines don't need explicitly create future , call set_result on @ all. pattern useful, see in unit tests , frameworks, rather in application code.

one interesting use of implementation of asyncio.sleep:

@coroutine def sleep(delay, result=none, *, loop=none):     """coroutine completes after given time (in seconds)."""     future = futures.future(loop=loop)     h = future._loop.call_later(delay, future.set_result, result)     try:         return (yield future)     finally:         h.cancel() 

here future created, set_result method future scheduled called after long caller wants sleep, , yield from called on future, make function wait long delay was, @ point future.set_result(result) called, , yield from call completes.


Comments

Popular posts from this blog

asp.net mvc - SSO between MVCForum and Umbraco7 -

Python Tkinter keyboard using bind -

ubuntu - Selenium Node Not Connecting to Hub, Not Opening Port -