我在请求中使用asyncio来尝试制作一个核心模块异步程序。尝试做这样的事情时遇到了困难
import asyncio
import requests
async def main():
await r = requests.get(URL)
我认为这是要等待get请求完成,然后将返回值放入r中,但是会发生此错误
File "prog.py", line 20
await r = requests.get(URL)
^
SyntaxError: can't assign to await expression
r =等待request.get(URL)也不起作用,给出
prog.py:31: RuntimeWarning: coroutine 'coroutine' was never awaited
coroutine(args)
有人知道该怎么做吗?
答案 0 :(得分:3)
await
? await
仅可用于等待coroutine
-通过调用用async def
定义的函数返回的特殊对象:
import asyncio
async def test():
return True
async def main():
# test() returns coroutine:
coro = test()
print(coro) # <coroutine object test at ...>
# we can await for coroutine to get result:
res = await coro
print(res) # True
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
也请阅读this answer,以了解如何使用asyncio
。
await requests.get(URL)
不起作用?由于requests.get
不是协程(未用async def
定义),因此它本质上是常规函数。
如果要异步发出请求,则应为此使用特殊的异步模块,例如aiohttp
或使用线程将requests
包装到协程中。有关两个示例,请参见代码段here。