python异步类型错误: object dict can't be used in 'await' expression

标签 python python-asyncio

我正在使用第三方模块从 API 检索数据。我只是想异步等待模块返回偶尔需要几秒钟并卡住我的应用程序的数据。但是,当我尝试等待对该模块的调用时,我收到了 TypeError:

TypeError: object dict can't be used in 'await' 表达式

import thirdPartyAPIwrapper

async def getData():
    retrienveData = await thirdPartyAPIWrapper.data()
    return await retrieveData

def main():
    loop = asncio.get_event_loop()
    data = loop.run_until_complete(getData())
    loop.close
    return data

为什么我不能等待类型('dict')?有没有解决的办法? 如果带有 asyncio 的 async/await 不能与不返回协程的第三方模块一起使用,那么我还有哪些其他选择?

最佳答案

只能等待异步(定义为async def)函数。整个想法是,这些函数是以特殊方式编写的,可以在不阻塞事件循环的情况下运行(await)它们。

如果你想从需要相当长的执行时间的公共(public)(用 def 定义)函数中获取结果,你有以下选择:

  • 将整个函数重写为异步
  • 在另一个线程中调用此函数并异步等待结果
  • 在另一个进程中调用此函数并异步等待结果

通常你想选择第二个选项。

下面是如何操作的示例:

import asyncio
import time
from concurrent.futures import ThreadPoolExecutor


_executor = ThreadPoolExecutor(1)


def sync_blocking():
    time.sleep(2)


async def hello_world():
    # run blocking function in another thread,
    # and wait for it's result:
    await loop.run_in_executor(_executor, sync_blocking)


loop = asyncio.get_event_loop()
loop.run_until_complete(hello_world())
loop.close()

请阅读this answer关于 asyncio 的工作原理。我想这会对你有很大帮助。

关于python异步类型错误: object dict can't be used in 'await' expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49822552/

相关文章:

python - 在 Python Click 库中使用 bool 标志(命令行参数)

Python Pandas 性能

python-3.x - Python,一种检查任务是否完成的干净方法

python - 将第三方库转换为 asyncio

python - 断言错误 : yield from wasn't used with future

python - 如何调用类中包含的异步函数?

python - 如何修复Python中的 “TypeError: string indices must be integers”错误

python - 如何使 Python 脚本可执行?

python - 与列表中的前缀和后缀单词匹配并返回包含所有链接单词的字符串

python - 异步初始化时将参数传递给 python 类