Когда или где добавляется обратный вызов через add_done_callback? - PullRequest
1 голос
/ 29 сентября 2019

Я читаю следующий код с помощью отладчика кода 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?

Заранее большое спасибо!

1 Ответ

0 голосов
/ 01 октября 2019

Если вы пытаетесь отладить в asyncio, тогда вы хотите установить "justMyCode": true в вашем launch.json.Это будет иметь трассировку отладчика в сторонний код, включая stdlib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...