使用Python SDK管理Azure资源锁遇AsyncItemPaged迭代错误求助
解决Azure Python异步SDK遍历Resource Lock的问题
你遇到的TypeError: 'AsyncItemPaged' object is not iterable错误,核心原因是Azure异步SDK返回的AsyncItemPaged是异步可迭代对象,不能用普通的同步for循环遍历,同时异步方法调用必须加await关键字。
修正方案1:使用异步迭代遍历(推荐)
直接用async for遍历异步分页对象,同时给delete方法加上await:
from azure.mgmt.resource.locks.v2016_09_01.aio import ManagementLockClient async def clear_resource_group_locks(credential, subscription, resource_group_snapshot): management_lock_client = ManagementLockClient(credential, subscription.subscription_id) # 获取异步分页的锁列表 locks = management_lock_client.management_locks.list_at_resource_group_level(resource_group_snapshot) # 异步遍历每个锁并删除 async for lock in locks: await management_lock_client.management_locks.delete(resource_group_snapshot, lock.name)
修正方案2:先转为普通列表再遍历
如果需要先获取所有锁的集合再处理,可以用await list(locks)将异步分页对象转为普通列表,之后用同步for循环(但删除操作仍需await):
from azure.mgmt.resource.locks.v2016_09_01.aio import ManagementLockClient async def clear_resource_group_locks(credential, subscription, resource_group_snapshot): management_lock_client = ManagementLockClient(credential, subscription.subscription_id) locks = management_lock_client.management_locks.list_at_resource_group_level(resource_group_snapshot) # 将异步分页对象转为普通列表 locks_list = await list(locks) for lock in locks_list: await management_lock_client.management_locks.delete(resource_group_snapshot, lock.name)
关键注意点
- 所有异步SDK的方法(包括
list_at_resource_group_level返回的分页对象、delete方法)都必须在异步上下文里执行,比如你需要用asyncio.run(clear_resource_group_locks(...))来触发这个异步函数 - 方案1的异步迭代更适合大量锁的场景,因为它会分批从Azure拉取数据,避免一次性加载所有数据占用过多内存
内容的提问来源于stack exchange,提问作者MoonHorse
相关产品推荐
相关产品推荐

