Slide 31
Slide 31 text
# Make a future for the return information
call_result = Future()
# Use call_soon_threadsafe to schedule a synchronous callback on the
# main event loop's thread
if not (self.main_event_loop and self.main_event_loop.is_running()):
# Make our own event loop and run inside that.
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(self.main_wrap(args, kwargs, call_result))
finally:
try:
if hasattr(loop, "shutdown_asyncgens"):
loop.run_until_complete(loop.shutdown_asyncgens())
finally:
loop.close()
asyncio.set_event_loop(self.main_event_loop)
else:
self.main_event_loop.call_soon_threadsafe(
self.main_event_loop.create_task,
self.main_wrap(
args,
kwargs,
call_result,
),
)
# Wait for results from the future.
return call_result.result()