【问题标题】:Python: Is there a way to join threads while using semaphoresPython:有没有办法在使用信号量时加入线程
【发布时间】: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


    【解决方案1】:

    我不得不将其切换到使用队列的消费者/生产者实现。这让我可以限制同时启动的集合数量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-14
      • 2011-01-26
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2012-01-01
      相关资源
      最近更新 更多