Parece que lo que quiere es simple: multiprocessing.current_process()
. Por ejemplo:
import multiprocessing
def f(x):
print multiprocessing.current_process()
return x * x
p = multiprocessing.Pool()
print p.map(f, range(6))
de salida:
$ 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]
Esto devuelve el propio objeto de proceso, por lo que el proceso puede ser su propia identidad. También puede llamar id
en él durante un identificador numérico único - en CPython, esta es la dirección de memoria del objeto de proceso, por lo que no hace pensar hay alguna posibilidad de solapamiento. Finalmente, puede usar la propiedad ident
o pid
del proceso, pero eso solo se establece una vez que se inicia el proceso.
Además, al revisar la fuente, me parece muy probable que los nombres autogenerados (como se ejemplifique con el primer valor en las cadenas de representación Process
arriba) sean únicos. multiprocessing
mantiene un objeto itertools.counter
para cada proceso, que se utiliza para generar una tupla _identity
para cualquier proceso hijo que genere. Por lo tanto, el proceso de nivel superior produce un proceso hijo con identificadores de valor único y generan un proceso con identificadores de dos valores, y así sucesivamente. Luego, si no se pasa ningún nombre al constructor Process
, simplemente autogenerates the name basado en _identity, usando ':'.join(...)
. Luego Pool
alters the name del proceso usando replace
, dejando el id autogenerado igual.
El resultado de todo esto es que, aunque dos Process
es pueden tener el mismo nombre, ya que puede asignar el mismo nombre a ellas cuando se crea, ellos son únicos, si no se toca el nombre parámetro. Además, teóricamente puedes usar _identity
como identificador único; ¡pero entiendo que hicieron esa variable privada por una razón!
Un ejemplo de lo anterior en acción:
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))
Salida:
$ 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]
¿Por qué no usar algo al azar, como UUID? –
@LuperRouch - ¿Podrías ampliar lo que quieres decir con eso? – JoshAdel
Por ejemplo '' process = Process (target = foo, name = uuid.uuid4(). Hex) '' daría nombres únicos a sus procesos. –