Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

параллельное выполнение цикла Python (одновременное выполнение задач)

execution
parallel
python
Теги: #<Tag:0x00007fedb7d6ad10> #<Tag:0x00007fedb7d6aba8> #<Tag:0x00007fedb7d6aa68>

#1

Внутри цикла отправляется запрос на удаление снепшота виртуальной машины.
Но так как цикл идет один за одним, пока один не завершен второй не запускается на удаление.
Как можно сделать несколько(3-5) запросов одновременно?

#!/usr/bin/python -u
import sys
import argparse
from pysphere import VIServer # Tested with vCenter Server 5.5.0 and pysphere package 0.1.7

# Main function
def purgeSnapshotStage():
	env = parser.parse_args().env

	# Get environment specific variables
	vmList = globals()[env + "VmList"]

	# Connect to vCenter
	vmServer = VIServer()
	vmServer.connect("MY_URL", username, password)

	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)

	vmServer.disconnect()

if __name__ == "__main__":
	purgeSnapshotStage()

(Ray Romanov) #2

#3

Спасибо, @RayRom

Подскажите в чем ошибка
vmList - содержит 16 имен vmName
Мой код 16 раз выполняется на последнем vmName почему-то:

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

В оригинальном варианте перебираются все 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

(Ilya Brik) #4

Надо передавать функции не список машин, а только одну машину. Соответственно, фунцкию надо поменять так, чтобы принимала только одну машину. И количество тредов должно быть равным количеству машин в списке.


#5

Остановился на вот этом варианте - запускает удаление снэпшотов на 16 машинах одновременно

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

def purgeSnapshotStage(vmName):
    # 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 + "   vmName:   " + 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 = 16  # number of VMs "parallelness"
pool = Pool(pool_size)

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

pool.close()
pool.join()