在 Python 多处理中总是需要使用 args 语法吗?

Is using the args syntax in Python multiprocessing always necessary?

我正在学习 Python 中的多处理方法,发现自己有一个问题。考虑以下示例:

import multiprocessing as mp

def worker(n):
    print('worker %d' % n)
    return

if __name__ == '__main__':
    jobs = []
    for i in range(5):
        p = mp.Process(target = worker, args = (i,))
        jobs.append(p)
        p.start()

这就是我所关注的文档如何使用 Process

用户args = (i,)有必要吗?我以前从未在 Python 中看到过这种语法,看起来很奇怪。我测试了,这完全一样:

p = mp.Process(target = worker(i))

有什么理由我应该避免这种情况吗?感谢您的帮助。

这是为了声明元组变量(没有,它是一个整数,一个字符串,一个浮点数……)但不是一个不可变的:

>>> i = 4
>>> k = (i,)
>>> type(k)
<type 'tuple'>
>>> k=(i)
>>> type(k)
<type 'int'>

这里有一个快速的方法可以让你证明这不是一回事。将您的 worker(i) 函数更改为:

import time

def worker(n):
    print('worker %d' % n)
    time.sleep(1)
    return

当您以第一种方式调用它时,您会注意到您仍然在一开始就同时获得所有 5 个打印件。当您以第二种方式进行时,您会看到所有 5 个打印件交错排列,每个打印件之间有一秒钟。

考虑一下您要尝试设置的内容:大约同时启动 5 个独立进程,每个进程大约同时打印,然后每个进程等待大约一秒钟,但总时间elapsed 只有一秒多一点。这就是你想要发生的事情。

关键点在这里:target = worker设置targetworker函数,args = (i,)设置args为单元素元组包含i。另一方面,target = worker(i) 调用 worker(i) 并将 target 设置为函数 return 的值,在本例中为 None。当你用第二种方法时,你根本没有真正使用 multiprocessing 。如果你有一个非常耗时的任务,你想拆分成多个进程,那么当你用第二种方法完成时,你将看不到任何改进。

基本上,只要你有 func(args),你就会 调用 函数并获取它的 return 值,而当你传递 funcargs 分开,您允许 multiprocessing 包发挥其魔力并在独立进程上进行这些函数调用。将目标设置为 func(args) 只会调用主进程中的函数,首先会失去多处理的任何好处。