Python: параллельное выполнение команд pysphere

Мой текущий цикл for делает одно за другим удаление снимков с моих 16 виртуальных машин

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()

Но есть ошибка, потому что она пытается выполнить команду "удалить" только на последней. Не нашел хорошего руководства по многопроцессорности и не смог найти как его отладить. Нужна помощь, чтобы найти ошибку.

1 ответ

Решение

У вас есть ошибка здесь:

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

Так должно быть:

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

И тогда в заголовке вашей функции вам нужно это:

def purgeSnapshotStage(vmList):

Тогда могут быть другие ошибки в вашем коде.

В целом: я сомневаюсь, что распараллеливание этого может дать вам какой-либо выигрыш в производительности. Ваше узкое место будет сервером VMware. Это не будет быстрее, если вы начнете одновременно удалять много заданий.

Другие вопросы по тегам