あなたが望むものは単純なようです: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を要求することもできますid
。cpythonでは、これはプロセスオブジェクトのメモリアドレスであるため、重複する可能性はないと思います。ident
最後に、プロセスのまたはプロパティを使用できますが、これpid
はプロセスが開始された後にのみ設定されます。
さらに、ソースを見ると、自動生成された名前(Process
上記のrepr文字列の最初の値で例示されている)が一意である可能性が非常に高いようです。すべてのプロセスのオブジェクトをmultiprocessing
維持します。これは、生成する子プロセスのタプルを生成するために使用されます。したがって、トップレベルのプロセスは単一値のIDを持つ子プロセスを生成し、2つの値のIDを持つプロセスを生成します。次に、コンストラクターに名前が渡されない場合は、。を使用して、_identityに基づいて名前を自動生成します。次に、を使用してプロセスの名前を変更し、自動生成されたIDを同じままにします。itertools.counter
_identity
Process
':'.join(...)
Pool
replace
これらすべての結果として、2つの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]