首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:并行执行pysphere命令

Python:并行执行pysphere命令
EN

Stack Overflow用户
提问于 2017-02-04 05:30:11
回答 1查看 136关注 0票数 0

我的current for循环从我的16个虚拟机中执行1/1删除快照

代码语言:javascript
复制
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)

我需要并行运行它(这样它就不会等待前一个作业完成后才开始下一个作业)我正在尝试应用“多处理”,下面是完整的代码:

代码语言:javascript
复制
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()

但是有一个错误,因为它试图只在最后一个上执行"remove“命令。没有找到关于多进程的好指南,也找不到如何调试它。需要帮助才能找到错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-04 19:19:12

这里有一个错误:

代码语言:javascript
复制
for vmName in vmList:
    pool.apply_async(purgeSnapshotStage, (vmList,))

它应该是:

代码语言:javascript
复制
for vmName in vmList:
    pool.apply_async(purgeSnapshotStage, (vmName,))

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

代码语言:javascript
复制
def purgeSnapshotStage(vmList):

然后,您的代码中可能还有其他错误。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42033300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档