def nested_io_loop(func): func = coroutine(func) @wraps(func) def wrapper(*pargs, **kwargs): loop = get_event_loop() preserved_ready = list(loop._ready) loop._ready.clear() task = async(func(*pargs, **kwargs)) preserved_task = task.__class__._current_tasks.get(loop) while not task.done(): try: loop._run_once() except _StopError: break loop._ready.extendleft(preserved_ready) # Reverses, but order shouldn't matter if preserved_task is not None: task.__class__._current_tasks[loop] = preserved_task else: task.__class__._current_tasks.pop(loop, None) return task.result() return wrapper