Python 实现多处理的最佳方法?

Python 实现多处理的最佳方法?,python,multiprocessing,Python,Multiprocessing,我已经看到了几种实现多处理的不同方法(即,通过循环您想要的多个进程并创建一个进程(),或使用multiprocessing.Pool()),我只是想知道这些方法之间是否有区别,以及其中一种方法是否比另一种方法更好/更有效 我当前的项目涉及将主机名列表拆分为n个子列表,然后在每个子列表上执行大量命令(每个子列表都在其自己的进程中)-最快的方法是什么?到目前为止,最简单的方法似乎是: def worker(hostList): for entry in hostList: #

我已经看到了几种实现多处理的不同方法(即,通过循环您想要的多个进程并创建一个进程(),或使用multiprocessing.Pool()),我只是想知道这些方法之间是否有区别,以及其中一种方法是否比另一种方法更好/更有效

我当前的项目涉及将主机名列表拆分为n个子列表,然后在每个子列表上执行大量命令(每个子列表都在其自己的进程中)-最快的方法是什么?到目前为止,最简单的方法似乎是:

def worker(hostList):
    for entry in hostList:
        # DoStuff

def main():
    jobs = []
    for entry in sublists:
        p = multiprocessing.Process(target=worker, args=(entry,))
        jobs.append(p)
        p.start()
使用此方法而不是Pool()有什么缺点吗

还有-只是一个旁注:为什么用逗号

args=(entry,)
我不理解这个语法,但它可以正常工作


提前谢谢

上面介绍的方法的缺点是,您最终会遇到
N
进程,其中
N
len(子列表)
。如果
子列表
的长度为100个元素,那么最终将有100个并发运行的进程。这给系统内存带来了巨大的负担,除非您的机器上有超过100个内核,否则只会影响性能,因为您不能同时执行超过
cpu\u count()
cpu限制的进程。这意味着操作系统需要不断地在进程之间切换上下文,以获得所有进程的CPU时间,这会降低速度

使用
multiprocessing.Pool()
创建固定数量的进程来完成工作(默认情况下,这意味着您不会有大量的进程。这节省了内存,并减少了由于运行的任务数量超过了要处理的核数而导致的过度上下文切换


args=(entry,)
中的尾随逗号是必需的,因为
args
关键字参数需要一个iterable(如元组或列表)。在Python中,元组是用逗号而不是括号创建的,所以只需执行
args=(entry)
实际上相当于
args=entry
entry
不一定是一个iterable,因此
Process
将对其执行错误操作。添加尾部逗号将创建一个单元素元组,并使
Process
保持愉快。如果要传递两个参数,则看起来更自然:
args=(entry1,entry2)

非常棒的解释,谢谢!我将使用Pool,因为我将使用多少处理作为参数(如果没有给出,默认为cpu_count()。因此,我将只生成所需数量的进程并使用该方法。谢谢!@user34034428没问题。另一个注意事项:如果您的工作人员主要执行I/O绑定任务,例如实际连接到主机列表中的主机并向其发送/接收数据,那么使用数量大于<代码>cpu_计数()。这是因为在阻塞I/O运行时,不需要CPU。因此,如果您有8个工作线程和4个CPU,只要有4个工作线程正在执行阻塞I/O,您就可以在没有过度上下文切换的情况下满负荷运行。@user34034428请注意,上述方法通常仅在某些工作线程将大部分时间用于阻塞I/O时才有效CKK。因此,即使您在workers中执行I/O,也可能对您没有帮助。不过,调整
池中的进程数以各种方式进行测试非常容易。感谢您的提示。他们实际上只是通过PSexec远程执行批处理脚本,因此主机之间没有太多I/O或数据共享我从何处运行脚本以及运行命令的其他主机