似乎你想要的很简单:
multiprocessing.current_process()
。例如:
import multiprocessing
def f(x):
print multiprocessing.current_process()
return x * x
p = multiprocessing.Pool()
print p.map(f, range(6))
输出:
$ python foo.py
<Process(PoolWorker-1, started daemon)>
<Process(PoolWorker-2, started daemon)>
<Process(PoolWorker-3, started daemon)>
<Process(PoolWorker-1, started daemon)>
<Process(PoolWorker-2, started daemon)>
<Process(PoolWorker-4, started daemon)>
[0, 1, 4, 9, 16, 25]
这将返回进程对象本身,因此进程可以成为自己的标识。您还可以调用
id
以获得唯一的数字ID - 在cpython中,这是进程对象的内存地址,因此我认为不存在任何重叠的可能性。最后,您可以使用进程的
ident
或
pid
属性 - 但这只有在进程启动后才设置。
此外,从源代码来看,我认为自动生成的名称(如上述Process
repr字符串中的第一个值所示)是唯一的。对于每个进程,multiprocessing
维护一个itertools.counter
对象,用于为它所生成的任何子进程生成_identity
元组。因此,顶级进程产生具有单值ID的子进程,它们又生成具有双值ID的进程,以此类推。然后,如果未向Process
构造函数传递名称,它将仅基于_identity自动生成名称,使用':'.join(...)
。然后,Pool
更改进程的名称,并使用replace
,使自动生成的ID保持不变。
这一切的结果是,尽管两个
Process
的名称可能相同,因为在创建它们时可以分配相同的名称,但如果您不触及名称参数,则它们是唯一的。此外,理论上可以使用
_identity
作为唯一标识符;但我想他们之所以将该变量设置为私有,是有原因的!
以上内容的示例:
import multiprocessing
def f(x):
created = multiprocessing.Process()
current = multiprocessing.current_process()
print 'running:', current.name, current._identity
print 'created:', created.name, created._identity
return x * x
p = multiprocessing.Pool()
print p.map(f, range(6))
输出:
$ python foo.py
running: PoolWorker-1 (1,)
created: Process-1:1 (1, 1)
running: PoolWorker-2 (2,)
created: Process-2:1 (2, 1)
running: PoolWorker-3 (3,)
created: Process-3:1 (3, 1)
running: PoolWorker-1 (1,)
created: Process-1:2 (1, 2)
running: PoolWorker-2 (2,)
created: Process-2:2 (2, 2)
running: PoolWorker-4 (4,)
created: Process-4:1 (4, 1)
[0, 1, 4, 9, 16, 25]
process = Process(target=foo, name=uuid.uuid4().hex)
可以为您的进程提供唯一的名称。 - Luper Rouchp.map(f, enumerate(jobs))
,更改f
的签名为f(arg)
,并将i, x = arg
拆分为f
的第一行。 - Attila the Fun