【发布时间】:2022-11-11 22:11:37
【问题描述】:
背景:
我有一个库存应用程序,可以从我们的各种 IT 资源(VMware、存储、备份等)中抓取数据。我们有一个注册了 2000 多个虚拟机的 vCenter。我有代码可以进入并在其自己的线程中提取每个 VM 的详细信息以并行化集合。
我将它们加入到父线程中,以便在移动到下一个区域之前完成不同的部分。我还将它设置为 10 分钟后超时,这样集合就不会被刚刚卡住的单个对象线程所阻止。但我发现,当我尝试一次提取大约 1000 个以上对象的数据时,它会使 vCenter 过载并终止我的连接,并且几乎所有子线程都死了。
我很确定它与低于 7.0 的 vCenter 版本部分相关(我们在很多地方都使用 6.7)。但由于硬件较旧,我们无法使用当前版本。
我想做的是限制使用信号量启动的线程数量,但也让它们在启动时加入父线程。我想到的所有方法要么最终序列化集合,要么最终在 10 分钟后加入超时。
有没有办法解决这个问题?让我卡住的部分是加入线程,因为它阻止了其余的操作。一旦我停止加入线程,我就无法加入任何其他人。
代码示例:
try:
objects = vsphere_client.vcenter.VM.list() # try newer REST API operation
old_objects = container_view.view # old pyvmomi objects
rest_api = True
except UnableToAllocateResource: # if there's too many objects for the REST API to return happens at 1000 on vCenter 6.7 and 4000 on 7.0
objects = container_view.view
old_objects = None
except OperationNotFound: # if different error happens
objects = container_view.view
old_objects = None
threads = []
for obj in objects:
thread = RESTVMDetail(vsphere_client, db_vcenter, obj, old_objects, rest_api, db_vms, db_hosts,
db_datastores, db_networks, db_vm_disks, db_vm_os_disks, db_vm_nics, db_vm_cdroms,
db_vm_floppies, db_vm_scsis, db_regions, db_sites, db_environments, db_platforms,
db_applications, db_functions, db_costs, db_vm_snapshots, api_limiter)
threads.append(thread)
for thread in threads:
thread.start()
for thread in threads:
thread.join(600)
【问题讨论】:
标签: python python-multithreading semaphore pyvmomi