似乎您想要的很简单:
multiprocessing.current_process()。例如:
import multiprocessingdef f(x): print multiprocessing.current_process() return x * xp = 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保持不变。
所有这一切的结果是,尽管两个
Processes 可能 具有相同的名称,但是由于在创建它们时 可以
为其分配相同的名称,因此如果您不触摸name参数,它们将是唯一的。同样,从理论上讲,您可以
_identity用作唯一标识符;但是我发现他们将这个变量设为私有是有原因的!
以上操作的一个示例:
import multiprocessingdef f(x): created = multiprocessing.Process() current = multiprocessing.current_process() print 'running:', current.name, current._identity print 'created:', created.name, created._identity return x * xp = 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]



