Я читаю следующий код с помощью отладчика кода Visual Studio (VSCode).
import asyncio
async def main():
print("OK Google. Wake me up in 1 seconds.")
await asyncio.sleep(1)
print("Wake up!")
if __name__ == "__main__":
asyncio.run(main(), debug=False)
Я мог понять основной поток программы, который планирует обратный вызов для приостановки процесса на секунду, нотрудно было понять, когда или где вызывается _run_until_complete_cb ?
После выполнения главной сопрограммы эта функция / обратный вызов вызывается, чтобы остановить цикл обработки событий, установив для флага _stopping значение True.Однако он изначально добавляется к внутреннему свойству _callbacks в классе Future с помощью add_done_callback или вызывается в ближайшее время, если будущее готово.
def add_done_callback(self, fn, *, context=None):
"""Add a callback to be run when the future becomes done.
The callback is called with a single argument - the future object. If
the future is already done when this is called, the callback is
scheduled with call_soon.
"""
if self._state != _PENDING:
self._loop.call_soon(fn, self, context=context)
else:
if context is None:
context = contextvars.copy_context()
self._callbacks.append((fn, context))
В любом случае, он регистрируется в цикле событий методом call_soon и вызывается на следующей итерации в конце.Но будущее еще не сделано, на данный момент добавлено предложение else выше.
У меня вопрос, где или когда будет сделано будущее, чтобы перейти к _run_until_complete_cb к предложению else?Поскольку отладчик VSCode просто пропускает или игнорирует строку кода, которая каким-то образом вызывает метод в экземплярах Future и Task, поток переходит прямо в call_soon в _run_until_complete_cb.
Что именно произошло после завершения главной сопрограммы?Есть ли у кого-нибудь идеи или советы по поводу процесса очистки модуля asyncio, чтобы остановить цикл обработки событий или способ просмотреть методы на Future или Task с помощью отладчика VSCode?
Заранее большое спасибо!