【问题标题】:Is controlled infinite recursion in asynchronous functions harmful?异步函数中的受控无限递归有害吗?
【发布时间】:2020-10-25 00:07:45
【问题描述】:
所以我显然知道无限循环很糟糕并且可能导致堆栈溢出,但在以下情况下,我使用异步函数来获取下一个日期,并让我的功能休眠直到我想要它执行的时间。这意味着它每天只会运行一次,准确的说是凌晨 12 点,并且会一直休眠到第二天。
async def foo():
sleep_until = await get_time() # gets time until 12am tomorrow
await asyncio.sleep(sleep_until)
# execute whatever my task is here
await foo()
虽然它运行良好且工作正常,但作为一个新手程序员,我有一些未解决的问题。
- 此代码块会导致内存泄漏吗?
- 之前的迭代是否会结束?还是它会永远存在直到程序崩溃或停止?
【问题讨论】:
标签:
python-3.x
asynchronous
recursion
async-await
【解决方案1】:
您可以使用一个简单的程序和一个简短的睡眠定时器自行测试。 是的,确实会导致堆栈溢出-
# bug.py
from asyncio import run, sleep
from datetime import datetime
async def foo():
print(datetime.now())
await sleep(.0001)
await foo() # recursion causes overflow
run(foo())
在这种情况下,明显的解决方法是使用 while 而不是递归 -
# fix.py
from asyncio import run, sleep
from datetime import datetime
async def forever(func, delay):
while True:
await func()
await sleep(delay)
async def foo():
print(datetime.now())
run(forever(foo, .0001)) # no overflow
或者在 python 领域之外思考,您可能需要考虑crontab(5)。