【问题标题】:Recursive async function memory leaks递归异步函数内存泄漏
【发布时间】:2021-07-11 10:02:06
【问题描述】:

我想知道这样的递归循环是否会长期导致内存泄漏

const loop = async (url: URL): Promise<void> => {
    
    await scrape(url)
    return await loop(url)
}

async function scrape(url: URL): Promise<void> {

    
    ...
    if (...)
       return await scrape(next_url)

}

function main() {
    await loop(...)
}

main()

loop 函数无限期地运行而不会停止。

【问题讨论】:

    标签: javascript typescript loops recursion memory-management


    【解决方案1】:

    我建议将条件移至 loop 并在异步生成器中使用 while 循环 -

    async function* loop(url) {
        while (true) {
          let res = await scrape(url)
          if (...) return
          yield res
          url = nextUrl
        }
    }
    

    您的 scrape 函数采用 url 并返回单个结果 -

    async function scrape(url) {
      ...
    }
    

    最后你的main 函数通过loopfor await .. of -

    async function main(initUrl) {
        const results = []
        for await (const res of loop(initUrl))
          results.push(res)
        return results
    }
    
    main().then(console.log, console.error)
    

    我可能建议将scrape 重命名为scrape1,如刮一页,并将loop 重命名为scrape。使用异步生成器的一个优点是调用者可以在页面进入时决定如何处理它们。在上面的示例中,我们将它们push 写入数组,但您可以写入磁盘或任何其他操作。

    【讨论】:

    • 感谢您的建议,但我想问的是像我这样的递归是否会导致内存泄漏。
    • 是的,因为loop 启动后没有什么可以阻止它。
    猜你喜欢
    • 2012-10-31
    • 2013-06-15
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2016-03-15
    • 1970-01-01
    相关资源
    最近更新 更多