等待方法并使用asyncio将变量分配给返回值?

时间:2018-09-09 17:05:44

标签: python-3.x python-asyncio

我在请求中使用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)

有人知道该怎么做吗?

1 个答案:

答案 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