【问题标题】: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()

虽然它运行良好且工作正常,但作为一个新手程序员,我有一些未解决的问题。

  1. 此代码块会导致内存泄漏吗?
  2. 之前的迭代是否会结束?还是它会永远存在直到程序崩溃或停止?

【问题讨论】:

    标签: 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)

    【讨论】:

      猜你喜欢
      • 2018-02-24
      • 2023-03-11
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2017-04-19
      • 2021-12-12
      相关资源
      最近更新 更多