看起来你想要的很简单: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
维护一个对象,该对象用于为它产生的任何子进程生成一个元组。因此顶级进程产生具有单值 id 的子进程,它们产生具有双值 id 的进程,依此类推。然后,如果没有将名称传递给构造函数,它会简单地根据 _identity自动生成名称,使用. 然后使用更改进程的名称,使自动生成的 id 保持不变。itertools.counter
_identity
Process
':'.join(...)
Pool
replace
这一切的结果是,虽然两个Process
es可能具有相同的名称,因为您可能在创建它们时为它们分配相同的名称,但如果您不触摸 name 参数,它们是唯一的。此外,理论上您可以_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]