栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为python多处理池中的worker获取唯一的ID

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为python多处理池中的worker获取唯一的ID

似乎您想要的很简单:

multiprocessing.current_process()
。例如:

import multiprocessingdef f(x):    print multiprocessing.current_process()    return x * xp = 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 -在CPython的,这是处理对象的内存地址,所以我不 认为
有重叠的任何可能性。最后,您可以使用流程的
ident
pid
属性-但这仅在流程启动后才进行设置。

此外,查看源代码,在我看来,自动生成的名称(如

Process
上面的repr字符串中的第一个值所示)很有可能是唯一的。为每个进程
multiprocessing
维护一个
itertools.counter
对象,该对象用于为其产生的
_identity
任何子进程生成一个元组。因此,顶层进程会生成具有单值ID的子进程,而它们会生成具有二值ID的子进程,依此类推。然后,如果没有名称传递给
Process
构造函数,它会使用_identity来自动生成名称
':'.join(...)
。然后使用
Pool

更改进程名称
replace
,使自动生成的ID保持不变。

所有这一切的结果是,尽管两个

Process
es 可能 具有相同的名称,但是由于在创建它们时 可以
为其分配相同的名称,因此如果您不触摸name参数,它们将是唯一的。同样,从理论上讲,您可以
_identity
用作唯一标识符;但是我发现他们将这个变量设为私有是有原因的!

以上操作的一个示例:

import multiprocessingdef f(x):    created = multiprocessing.Process()    current = multiprocessing.current_process()    print 'running:', current.name, current._identity    print 'created:', created.name, created._identity    return x * xp = 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]


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/645585.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号