Python asyncio运行时报future属于不同事件循环的ValueError如何解决?
问题根因
- 遍历
accounts的循环内每次迭代都新建了独立的事件循环实例,asyncio.ensure_future创建的任务会自动绑定到当前上下文的事件循环,也就是说你tasks列表里的每个任务分别属于不同的事件循环实例。 - 最终你调用
run_until_complete用的是最后一次迭代生成的事件循环,它只能运行绑定到自身的任务,其他任务归属的循环和当前运行的循环不匹配,因此抛出ValueError。
修复方案
将事件循环的初始化逻辑移到for循环外部,确保所有任务都绑定到同一个事件循环实例即可,修复后代码如下:
# 提前初始化唯一的事件循环,放在for循环外 loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) for account_item in accounts: account_obj_map[account_item.id] = account_item balance_params = {"account-id": account_item.id} balance_request = GetBalanceService(balance_params).get_request(**self.__kwargs) balance_url = server_url + balance_request.url tasks.append(asyncio.ensure_future( self.async_get_account_balance(balance_url,account_item.id,account_balance_json_map))) # 直接用提前创建的循环运行所有任务 loop.run_until_complete(asyncio.wait(tasks))
补充说明
- 如果你使用的是Python 3.7及以上版本,可以用
asyncio.create_task()替代asyncio.ensure_future(),功能完全一致,可读性更强。 - 任务运行结束后如果不需要保留循环,可以调用
loop.close()释放资源。
内容的提问来源于stack exchange,提问作者yair_elmaliah
相关产品推荐
相关产品推荐

