Почему рекурсия Python `ждать 'заставляет глубину рекурсии превышать предел?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему рекурсия Python `ждать 'заставляет глубину рекурсии превышать предел?

Сообщение Anonymous »

Я знаю, что мы никогда не должны писать патологический код, как ниже в производстве, следующие приведены лишь некоторые примеры для иллюстрации.

Код: Выделить всё

import asyncio
import logging
import sys

sys.setrecursionlimit(19)  # to make it occurr quickly

async def main(num: int = 0):
print(num)
await asyncio.sleep(0.0001)
await main(num + 1)

if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG)
asyncio.run(main())
< /code>
# $ python tmp.py
DEBUG:asyncio:Using selector: EpollSelector
0
1
2
3
4
5
6
7
Traceback (most recent call last):
File "/data/projects/data1/xxx/yyy/tmp.py", line 16, in 
asyncio.run(main())
File "/data/users/xxx/miniconda3/lib/python3.12/asyncio/runners.py", line 194, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "/data/users/xxx/miniconda3/lib/python3.12/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/users/xxx/miniconda3/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "/data/projects/data1/xxx/yyy/tmp.py", line 11, in main
await main(num + 1)
File "/data/projects/data1/xxx/yyy/tmp.py", line 11, in main
await main(num + 1)
File "/data/projects/data1/xxx/yyy/tmp.py", line 11, in main
await main(num + 1)
[Previous line repeated 4 more times]
File "/data/projects/data1/xxx/yyy/tmp.py", line 10, in main
await asyncio.sleep(0.0001)
File "/data/users/xxx/miniconda3/lib/python3.12/asyncio/tasks.py", line 661, in sleep
h = loop.call_later(delay,
^^^^^^^^^^^^^^^^^^^^^^
File "/data/users/xxx/miniconda3/lib/python3.12/asyncio/base_events.py", line 761, in call_later
timer = self.call_at(self.time() + delay, callback, *args,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/users/xxx/miniconda3/lib/python3.12/asyncio/base_events.py", line 778, in call_at
timer = events.TimerHandle(when, callback, args, self, context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/users/xxx/miniconda3/lib/python3.12/asyncio/events.py", line 112, in __init__
super().__init__(callback, args, loop, context)
File "/data/users/xxx/miniconda3/lib/python3.12/asyncio/events.py", line 45, in __init__
if self._loop.get_debug():
^^^^^^^^^^^^^^^^^^^^^^
RecursionError: maximum recursion depth exceeded
< /code>
Да, это патологическая рекурсивная функция без условий выхода. Если мы удалим все async
и await , затем назовите его синхронно, он, конечно, сообщит об ошибке превышения предела рекурсии, поскольку кадр стека каждого вызова функции сразу же создается недавно созданный in situ (в рамках стека функции вызывающего средства), а уровень гнездования быстро выходит из контроля. Обратные вызовы, организованные The Event Loop для организации зависимостей между этими кадрами стека? Цикл событий будет нести ответственность за предоставление местоположения для фактического вызова (а не напрямую расширить его на месте, как синхронизация). Следовательно, даже если есть некоторые проблемы с памятью, это должно быть истощение памяти, а не рекурсионное ограничение, превышающее неверное.

Код: Выделить всё

  File "/data/projects/data1/xxx/yyy/tmp.py", line 11, in main
await main(num + 1)
File "/data/projects/data1/xxx/yyy/tmp.py", line 11, in main
await main(num + 1)
File "/data/projects/data1/xxx/yyy/tmp.py", line 11, in main
await main(num + 1)
[Previous line repeated 4 more times]
Может ли кто -нибудь объяснить, что происходит? Это соответствует ожиданиям даже в моей неправильной теории.


Подробнее здесь: https://stackoverflow.com/questions/796 ... d-the-limi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»