【问题标题】:Weird behavior from pythons multiprocessingpython多处理的奇怪行为
【发布时间】:2014-11-24 20:21:01
【问题描述】:

我正在尝试的代码是:

def update_vm(si, vm):
    env.host_string = vm
    with settings(user=VM_USER, key_filename=inputs['ssh_key_path']):
        put(local_file, remote_zip_file)
        run('tar -zxpf %s' % remote_zip_file)
        run('sudo sh %s' % REMOTE_UPDATE_SCRIPT)
        response_msg = run('cat %s' % REMOTE_RESPONSE_FILE)
        if 'success' in response_msg:
            #do stuff
        else:
            #do stuff

def update_vm_wrapper(args):
    return update_vm(*args)

def main():
    try:
        si = get_connection()
        vms = [vm1, vm2, vm3...]
        update_jobs = [(si, vm) for vm in vms]
        pool = Pool(30)
        pool.map(update_vm_wrapper, update_jobs)
        pool.close()
        pool.join()
    except Exception as e:
        print e
if __name__ == "__main__":
    main()

现在的问题是我看到它试图将 zip 文件放在同一个 vm(比如 vm1)中 3 次(我猜是 vms 的长度)。并尝试执行其他 ssh 命令 3 次。

对 update_vm() 方法使用锁可以解决问题。但它看起来不再是多处理器解决方案。它更像是遍历一个循环。

我在这里做错了什么?

【问题讨论】:

  • 你从哪里得到env?
  • 这是 ssh 操作的结构库

标签: python multiprocessing


【解决方案1】:

Fabric 为parallel execution of tasks 提供了自己的设施 - 您应该使用这些设施,而不是仅仅尝试在多处理池中执行 Fabric 任务。问题是 env 对象在执行任务时发生了变异,所以不同的工作人员会互相踩踏(除非你加锁)。

【讨论】:

  • 太棒了!我不知道fabric 有它自己对并行执行的支持。这也使用了一个简单的装饰器@parallel
猜你喜欢
  • 2014-10-09
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2011-06-16
  • 2017-02-14
相关资源
最近更新 更多