Python中如何向asession.run()传递可变数量的异步函数且不提前执行
问题根源
你代码中functionList.append(get_html(url))的写法等价于直接调用了get_html异步函数,所以会立刻执行,而AsyncHTMLSession.run()要求传入的是未执行的无参异步函数对象,不需要提前调用传参。
修复方案
只需要把带参数的get_html包装成无参的函数对象即可,推荐两种稳定写法:
写法1:使用functools.partial固定参数(兼容性最好)
from requests_html import AsyncHTMLSession from functools import partial asession = AsyncHTMLSession() urls = [ 'https://python.org/', 'https://reddit.com/', 'https://google.com/' ] async def get_html(url): r = await asession.get(url) return r functionList = [] for url in urls: # partial会将原函数和传入的参数绑定,返回新的无参可调用对象,不会立刻执行原函数 functionList.append(partial(get_html, url)) results = asession.run(*functionList) for result in results: print(result.html.url)
写法2:使用异步lambda包装
注意要通过url=url的写法提前绑定当前循环的url值,避免闭包变量延迟捕获的问题:
# 其余代码和上面一致,仅修改循环部分 for url in urls: functionList.append(lambda url=url: get_html(url))
内容的提问来源于stack exchange,提问作者pulsar777
相关产品推荐
相关产品推荐

