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]
Может ли кто -нибудь объяснить, что происходит? Это соответствует ожиданиям даже в моей неправильной теории.
Я знаю, что мы никогда не должны писать патологический код, как ниже в производстве, следующие приведены лишь некоторые примеры для иллюстрации.[code]import asyncio import logging import sys
sys.setrecursionlimit(19) # to make it occurr quickly
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[/code] и await , затем назовите его синхронно, он, конечно, сообщит об ошибке превышения предела рекурсии, поскольку кадр стека каждого вызова функции сразу же создается недавно созданный in situ (в рамках стека функции вызывающего средства), а уровень гнездования быстро выходит из контроля. Обратные вызовы, организованные The Event Loop для организации зависимостей между этими кадрами стека? Цикл событий будет нести ответственность за предоставление местоположения для фактического вызова (а не напрямую расширить его на месте, как синхронизация). Следовательно, даже если есть некоторые проблемы с памятью, это должно быть истощение памяти, а не рекурсионное ограничение, превышающее неверное.[code] 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] [/code] Может ли кто -нибудь объяснить, что происходит? Это соответствует ожиданиям даже в моей неправильной теории.
Я настраиваю локальную среду через MAMP на сайте, который я снял с Интернета пару месяцев назад, чтобы просмотреть некоторые старые функции на сайте, и в настоящее время я получаю следующую ошибку в моем файле apache_error.log.
Я пытаюсь найти нерекурсивный «мощный/универсальный» алгоритм обхода дерева, который в конечном итоге дает не только узел, но и глубину узла, его родительский и родственный индексы, а также способен использовать метод «сначала в ширину». поиск (BFS)...
Я пытаюсь найти нерекурсивный «мощный/универсальный» алгоритм обхода дерева, который в конечном итоге дает не только узел, но и глубину узла, его родительский и родственный индексы, а также способен использовать метод «сначала в ширину». поиск (BFS)...
Когда я пытаюсь добавить задачу в Rabbitmq с Async_Result Иногда я получаю следующую ошибку, если запустить функцию еще раз, то она не показывает никакой ошибки
ERROR:root:maximum recursion depth exceeded while calling a Python object
web |...
Когда я пытаюсь добавить задачу в Rabbitmq с Async_Result Иногда я получаю следующую ошибку, если запустить функцию еще раз, то она не показывает никакой ошибки
ERROR:root:maximum recursion depth exceeded while calling a Python object
web |...