我正在使用第三方模块从 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/