<p>你想要的似乎很简单:<code>multiprocessing.current_process()</code>。例如:</p>
<pre><code>import multiprocessing
def f(x):
print multiprocessing.current_process()
return x * x
p = multiprocessing.Pool()
print p.map(f, range(6))
</code></pre>
<p>输出:</p>
<pre><code>$ 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]
</code></pre>
<p>这将返回进程对象本身,因此进程可以是自己的标识。你也可以对它调用<code>id</code>来获得一个唯一的数字id——在cpython中,这是进程对象的内存地址,所以我不认为有重叠的可能。最后,您可以使用进程的<code>ident</code>或<code>pid</code>属性——但这只在进程启动时设置。</p>
<p>此外,在我看来,在源代码中,自动生成的名称(如上面的<code>Process</code>repr字符串中的第一个值所示)很可能是唯一的。<code>multiprocessing</code>为每个进程维护一个<code>itertools.counter</code>对象,该对象用于为其生成的任何子进程生成一个<a href="http://hg.python.org/cpython/file/ed954d11dadd/Lib/multiprocessing/process.py#l98">^{<cd8>}</a>元组。因此,顶级进程生成具有单值id的子进程,它们生成具有两个值id的进程,依此类推。然后,如果没有名称传递给<code>Process</code>构造函数,那么它只是基于<a href="http://hg.python.org/cpython/file/ed954d11dadd/Lib/multiprocessing/process.py#l111">autogenerates the name</a>标识,使用<code>':'.join(...)</code>。然后使用<code>replace</code>的进程的<code>Pool</code><a href="http://hg.python.org/cpython/file/ed954d11dadd/Lib/multiprocessing/pool.py#l223">alters the name</a>,保持自动生成的id相同。</p>
<p>所有这一切的结果是,尽管两个<code>Process</code>es<em>可能具有相同的名称,因为您在创建它们时可能会将相同的名称赋给它们,但如果您不触摸name参数,它们是唯一的。另外,理论上可以使用<code>_identity</code>作为唯一标识符;但我认为他们将该变量设为私有是有原因的!</p>
<p>上述措施的一个例子:</p>
<pre><code>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))
</code></pre>
<p>输出:</p>
<pre><code>$ 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]
</code></pre>