【问题标题】:How to write a recursive function which performs tasks asynchronously?如何编写一个异步执行任务的递归函数?
【发布时间】:2017-03-06 16:47:16
【问题描述】:

如何在python中创建递归协程函数?

import asyncio

def fetch_url(x):
    if isinstance(x, list):
        return map(fetch_url, x)
    else:
        return parsed_url(x)

也就是说,当double(10) 被调用时,该函数将同步执行,而当double([2,3,4]) 被调用时,它将异步执行。

【问题讨论】:

    标签: python-3.x asynchronous recursion async-await python-asyncio


    【解决方案1】:

    如果“将异步执行”是指“并行”,试试这个:

    async def fetch_url(x):
        if isinstance(x, list):
            return await asyncio.gather(*[fetch_url(url) for url in x])
    
        return parsed_url(x)
    

    【讨论】:

    • 是否有可能拥有一个内部能够异步调用自身的普通函数?也就是说,在上面的代码中,fetch_url 是一个协程,即使需要获取单个 url,也必须在循环内执行。有没有办法让这个函数始终可调用但内部异步且理想地递归?
    • fetch_url(url) 表示它是一个协程。而不是 asyncio,您可能需要考虑 concurrent.futures
    • 有没有办法使用concurrent.futures在单线程中执行异步任务? AFAIK concurrent.futures 需要使用多线程 (ThreadPoolExecutor) 或多处理 (ProcessPoolExecutor)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2021-05-10
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多