Có vẻ như những gì bạn muốn đơn giản: multiprocessing.current_process()
. Ví dụ:
import multiprocessing
def f(x):
print multiprocessing.current_process()
return x * x
p = multiprocessing.Pool()
print p.map(f, range(6))
Output:
$ 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]
này trả về đối tượng quá trình tự, vì vậy quá trình này có thể được bản sắc riêng của mình. Bạn cũng có thể gọi id
trên đó để có một id số duy nhất - trong cpython, đây là địa chỉ bộ nhớ của đối tượng quá trình, vì vậy tôi không nghĩ rằng có khả năng chồng chéo nào đó. Cuối cùng, bạn có thể sử dụng thuộc tính ident
hoặc thuộc tính pid
của quy trình - nhưng điều đó chỉ được đặt khi quá trình được bắt đầu.
Hơn nữa, nhìn qua nguồn, có vẻ như với tôi rất có khả năng tên được tạo tự động (như được minh họa bằng giá trị đầu tiên trong chuỗi repr Process
ở trên) là duy nhất. multiprocessing
duy trì đối tượng itertools.counter
cho mọi quá trình, được sử dụng để tạo ra một bộ nhái _identity
cho bất kỳ quá trình con nào mà nó sinh ra. Vì vậy, quy trình cấp cao nhất tạo ra tiến trình con với các id giá trị đơn, và chúng sinh ra quá trình với các id hai giá trị, và cứ thế. Sau đó, nếu không có tên nào được chuyển đến hàm tạo Process
, nó chỉ đơn giản là autogenerates the name dựa trên _identity, sử dụng ':'.join(...)
. Sau đó, Pool
alters the name của quá trình sử dụng replace
, để nguyên id được tạo tự động.
Kết quả cuối cùng của tất cả điều này là mặc dù hai Process
es thể có cùng tên, bởi vì bạn có thể gán cùng tên với họ khi bạn tạo chúng, họ là duy nhất nếu bạn không chạm vào tên tham số. Ngoài ra, bạn về lý thuyết có thể sử dụng _identity
làm định danh duy nhất; nhưng tôi thu thập họ đã biến biến đó thành riêng tư vì một lý do!
Một ví dụ ở trên trong hành động:
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))
Output:
$ 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]
Tại sao không sử dụng một cái gì đó ngẫu nhiên như uuid? –
@LuperRouch - Bạn có thể mở rộng những gì bạn muốn nói không? – JoshAdel
Ví dụ: 'process = Process (target = foo, name = uuid.uuid4(). Hex)' 'sẽ cung cấp tên duy nhất cho các process của bạn. –