Pythonマルチプロセッシングプールの各ワーカーに一意のIDを割り当てて、プール内の特定のワーカーによって実行されているジョブがどのワーカーがそれを実行しているかを知ることができるようにする方法はありますか?ドキュメントによると、Process
にname
は
名前は識別目的のみに使用される文字列です。意味はありません。複数のプロセスに同じ名前を付けることができます。
私の特定のユースケースでは、4 つの GPU のグループで多数のジョブを実行し、ジョブを実行する GPU のデバイス番号を設定する必要があります。ジョブの長さは均一ではないため、前のジョブが完了する前に、そのジョブを実行しようとしている GPU で衝突が発生しないようにする必要があります (そのため、事前に作業単位に ID を事前に割り当てることはできません)。
ベストアンサー1
あなたが望んでいるのは単純なことのようです: 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
を保持しitertools.counter
、それを使用して_identity
生成された子プロセスに対してタプルを作成します。つまり、トップレベルのプロセスは単一値IDを持つ子プロセスを生成し、それらは2値IDを持つプロセスを生成します。そして、コンストラクタに名前が渡されない場合はProcess
、単に名前を自動生成する_identityに基づいて、 を使用します':'.join(...)
。次にPool
名前を変更するプロセスは を使用してreplace
、自動生成された ID を同じままにします。
結局のところ、2つのProcess
es5月同じ名前を持っているので、5月作成時に同じ名前を割り当てます。名前パラメータを変更しない限り、一意になります。また、理論的には_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]