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

时间:2015-07-27 21:41:58

标签: python syntax python-multiprocessing args

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

function fixDiv() {
  $('.super-image-thumb').css({
      'top': $('.sliding-panel-content').scrollTop()+'px'
    });
}
$('.sliding-panel-content').scroll(fixDiv);
fixDiv();

这就是我关注的文档使用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?我以前从未在Python中看过这种语法,看起来很奇怪。我测试了,这完全相同:

args = (i,)

我有什么理由可以避免这种情况吗?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

这是一种快速的方式来证明它不是一回事。将您的worker(i)功能更改为:

import time

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

当你以第一种方式调用它时,你会注意到你仍然可以在开始的同时获得所有5个打印件。当你以第二种方式做到这一点时,你会看到你将所有5个版画交错排列,每个版画之间有一秒钟。

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

以下是关键点:target = workertarget设置为worker函数,args = (i,)args设置为包含{{{0}的单个元素元组1}}。另一方面,i调用target = worker(i)并将worker(i)设置为函数返回的值,在本例中为target。当你第二种方式执行时,你根本就没有使用None。如果你有一个非常耗时的任务,你希望分成多个进程,那么当它以第二种方式完成时,你将看不到任何改进。

基本上,只要你有multiprocessing,你就会调用函数并获取其返回值,而当你通过func(args)和{{1}时单独地,您允许func包发挥其魔力并在独立进程上进行这些函数调用。将目标设置为args只会调用主进程中的函数,从而首先从多处理中失去任何好处。

答案 1 :(得分:0)

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

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