有没有一种方法可以为python多处理池中的每个worker分配一个惟一的ID,从而使池中的某个特定worker运行的作业能够知道哪个worker在运行它?根据文件,a Process
有一个name
但是
The name is a string used for identification purposes only. It has no semantics. Multiple processes may be given the same name.
对于我的特定用例,我想在一个由四个GPU组成的组上运行一组作业,并且需要为该作业应该运行的GPU设置设备号。由于作业的长度不一致,我希望确保在前一个作业完成之前,在试图在其上运行的作业的GPU上不会发生冲突(因此这排除了提前为工作单元预先分配ID)。
我用线程完成了这项工作,最后使用a queue来处理作业管理。这是基线。我的完整版本有一堆
try-catches
(特别是在worker中,以确保即使失败也调用q.task_done()
)。我不需要使用多处理(我的工作人员只是调用外部进程),但这可以扩展。用于多处理的API改变了它,下面是如何适应的:
两个版本都将输出如下内容:
您可以使用
multiprocessing.Queue
来存储id,然后在池进程初始化时获取id。优点:
queue.get()
上阻塞,并且不会执行任何工作(这不会阻塞porgram,或者至少在我测试时不会)。缺点:
示例:
输出:
注意,虽然池包含8个进程,并且一个idx仅由一个进程使用,但只有4个不同的pid。
你想要的似乎很简单:
multiprocessing.current_process()
。例如:输出:
这将返回进程对象本身,因此进程可以是自己的标识。你也可以对它调用
id
来获得一个唯一的数字id——在cpython中,这是进程对象的内存地址,所以我不认为有重叠的可能。最后,您可以使用进程的ident
或pid
属性——但这只在进程启动时设置。此外,在我看来,在源代码中,自动生成的名称(如上面的} 元组。因此,顶级进程生成具有单值id的子进程,它们生成具有两个值id的进程,依此类推。然后,如果没有名称传递给
Process
repr字符串中的第一个值所示)很可能是唯一的。multiprocessing
为每个进程维护一个itertools.counter
对象,该对象用于为其生成的任何子进程生成一个^{Process
构造函数,那么它只是基于autogenerates the name标识,使用':'.join(...)
。然后使用replace
的进程的Pool
alters the name,保持自动生成的id相同。所有这一切的结果是,尽管两个
Process
es可能具有相同的名称,因为您在创建它们时可能会将相同的名称赋给它们,但如果您不触摸name参数,它们是唯一的。另外,理论上可以使用_identity
作为唯一标识符;但我认为他们将该变量设为私有是有原因的!上述措施的一个例子:
输出:
相关问题 更多 >
编程相关推荐