2017-02-03 91 views
0

我对环路电流不分级1移除快照从我16个虚拟机的Python:并行执行pysphere命令

for vmName in vmList: 
    snapshots = vmServer.get_vm_by_name(vmName).get_snapshots() 
    for i in range(len(snapshots)-3): 
     snapshotName = snapshots[i].get_name() 
     print "Deleting snapshot " + snapshotName + " of " + vmName 
     vmServer.get_vm_by_name(vmName).delete_named_snapshot(snapshotName) 

我需要并行运行它(所以它不会等待以前的工作的完成 - 开始下一个) 我试图运用“多”,这里是全码:

import argparse 
from pysphere import VIServer # Tested with vCenter Server 5.5.0 and pysphere package 0.1.7 
from CONFIG import * # Contains username and password for vCenter connection, list of VM names to take snapshot 
from multiprocessing.pool import ThreadPool as Pool 

def purgeSnapshotStage(vmList): 
    # Connect to vCenter 
    vmServer = VIServer() 
    vmServer.connect("VM_ADDRESS", username, password) 

    snapshots = vmServer.get_vm_by_name(vmName).get_snapshots() 
    for i in range(len(snapshots) - 3): 
     snapshotName = snapshots[i].get_name() 
     print "Deleting snapshot " + snapshotName + " of VM: " + vmName 
     vmServer.get_vm_by_name(vmName).delete_named_snapshot(snapshotName) 

    vmServer.disconnect() 

# Get the environment to delete snapshot from command line 
parser = argparse.ArgumentParser(description="Take snapshot of VMs for stage or stage2") 
parser.add_argument('env', choices=("stage", "stage2", "stage3"), help="Valid value stage or stage2 or stage3") 
env = parser.parse_args().env 
vmList = globals()[env + "VmList"] 

pool_size = 5 # your "parallelness" 
pool = Pool(pool_size) 

for vmName in vmList: 
    pool.apply_async(purgeSnapshotStage, (vmList,)) 

pool.close() 
pool.join() 

但有一个错误,因为它试图执行“删除”命令只在最后一个。 没有找到好的多处理指南,也找不到如何调试它。 需要帮助来查找错误。

回答

0

您在这里有一个错误:

for vmName in vmList: 
    pool.apply_async(purgeSnapshotStage, (vmList,)) 

它应该是:

for vmName in vmList: 
    pool.apply_async(purgeSnapshotStage, (vmName,)) 

,然后在函数头,你需要这样的:

def purgeSnapshotStage(vmList): 

然后,有可能在你的代码中出现其他错误。

一般:我怀疑并行化这可能会给你任何性能优势。您的瓶颈将是vmware服务器。当您同时启动多个删除作业时速度不会更快。