[英]Python: Parallel execution pysphere commands
我當前的for循環從1個虛擬機中刪除快照的方式是1比1
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()
但是有一個錯誤,因為它試圖僅對最后一個執行“刪除”命令。 找不到有關多處理的良好指南,也找不到如何調試它。 需要幫助以發現錯誤。
您在這里有一個錯誤:
for vmName in vmList:
pool.apply_async(purgeSnapshotStage, (vmList,))
它應該是:
for vmName in vmList:
pool.apply_async(purgeSnapshotStage, (vmName,))
然后在函數標題中,您需要這樣做:
def purgeSnapshotStage(vmList):
然后,您的代碼中可能還會出現其他錯誤。
通常:我懷疑並行執行此操作會不會給您帶來任何性能優勢。 您的瓶頸將是vmware服務器。 同時啟動多個刪除作業時,速度不會更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.