ets*_*ner 2 python asynchronous python-3.x python-asyncio python-requests-html
我正在尝试使用 python 包resuqests_html异步 get() URL 列表,类似于自述文件中使用 Python 3.6.5 和 requests_html 0.10.0 的异步示例。
我的理解是 AsyncHTMLSession.run() 应该与 asyncio.gather() 非常相似:你给它一堆可等待的东西,它会运行所有的东西。这是不正确的吗?
这是我正在尝试的代码,我希望它应该获取页面并存储响应:
from requests_html import AsyncHTMLSession
async def get_link(url):
r = await asession.get(url)
return r
asession = AsyncHTMLSession()
results = asession.run(get_link("http://google.com"), get_link("http://yahoo.com"))
Run Code Online (Sandbox Code Playgroud)
但我却得到了这个异常:
Traceback (most recent call last):
File "test.py", line 10, in <module>
results = asession.run(get_link("google.com"), get_link("yahoo.com"))
File ".\venv\lib\site-packages\requests_html.py", line 772, in run
asyncio.ensure_future(coro()) for coro in coros
File ".\venv\lib\site-packages\requests_html.py", line 772, in <listcomp>
asyncio.ensure_future(coro()) for coro in coros
TypeError: 'coroutine' object is not callable
sys:1: RuntimeWarning: coroutine 'get_link' was never awaited
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?
难道我做错了什么?
您没有asession.run正确调用。
asyncio.gather接受可等待对象,例如通过调用协程(异步)函数获得的协程对象。asession.run另一方面,接受callables,例如异步函数,它将调用它来生成可等待项。区别就像一个函数接受一个可迭代对象,您可以传递一个实例化的生成器,而另一个函数接受一个可返回的可迭代对象,您可以传递一个生成器函数本身。
由于您的异步函数有参数,因此您不能只传递get_link给asession.run; 您必须使用functools.partial或 lambda 本身:
results = asession.run(
lambda: get_link("http://google.com"),
lambda: get_link("http://yahoo.com"),
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3333 次 |
| 最近记录: |