在 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
设置target
为worker
函数,args = (i,)
设置args
为单元素元组包含i
。另一方面,target = worker(i)
调用 worker(i)
并将 target
设置为函数 return 的值,在本例中为 None
。当你用第二种方法时,你根本没有真正使用 multiprocessing
。如果你有一个非常耗时的任务,你想拆分成多个进程,那么当你用第二种方法完成时,你将看不到任何改进。
基本上,只要你有 func(args)
,你就会 调用 函数并获取它的 return 值,而当你传递 func
和 args
分开,您允许 multiprocessing
包发挥其魔力并在独立进程上进行这些函数调用。将目标设置为 func(args)
只会调用主进程中的函数,首先会失去多处理的任何好处。
我正在学习 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
设置target
为worker
函数,args = (i,)
设置args
为单元素元组包含i
。另一方面,target = worker(i)
调用 worker(i)
并将 target
设置为函数 return 的值,在本例中为 None
。当你用第二种方法时,你根本没有真正使用 multiprocessing
。如果你有一个非常耗时的任务,你想拆分成多个进程,那么当你用第二种方法完成时,你将看不到任何改进。
基本上,只要你有 func(args)
,你就会 调用 函数并获取它的 return 值,而当你传递 func
和 args
分开,您允许 multiprocessing
包发挥其魔力并在独立进程上进行这些函数调用。将目标设置为 func(args)
只会调用主进程中的函数,首先会失去多处理的任何好处。