首页 文章

python-asyncio TypeError:object dict可以't be used in '等待'表达式

提问于
浏览
3

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

TypeError: object dict can't be used in 'await' expression

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不能与不返回协程的第三方模块一起使用,那么我的其他选项是什么?

1 回答

  • 5

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

    如果你想从common(用 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的工作原理 . 我认为它会对你有所帮助 .

相关问题