繁体   English   中英

pythons多处理的奇怪行为

[英]Weird behavior from pythons multiprocessing

我正在尝试的代码是:

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()方法使用锁可以解决此问题。 但它看起来不再是多处理器解决方案。 它更像是遍历循环。

我在这里做什么错?

Fabric具有自己的并行执行任务的功能 -您应该使用这些功能,而不仅仅是尝试在多处理池中执行Fabric任务。 问题在于执行任务时env对象会发生突变,因此不同的工作程序会互相踩踏(除非您锁定了)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM