繁体   English   中英

如何跨多个进程在Python类中创建唯一ID

[英]How to create a unique ID in a Python Class across multiple processes

我想编写一个对象,该对象在实例化时为每个实例生成一个新的ID。 但是,此ID必须为

  • 以线程和进程安全的方式生成
  • 甚至在整个流程中也是唯一的(通过多处理程序生成)

一些无关紧要的问题:

  • 这种特定的对象创建不是性能关键,因此由此带来的同步开销是可以接受的。
  • ID不能是串行的,尽管通常附带一个干净的解决方案。
  • 我们很无知,根本不关心python 2。

已经有一些解决方案仅在一个过程中起作用,最优雅的解决方案是使用itertools.count()对象。 使用id()是没有选择的,因为它不能保证唯一。 理想的解决方案可能是与itertools.count()类似的对象,该对象在进程之间拥有一些静态全局值。

关于我们项目的相关讨论: https : //github.com/coala-analyzer/coala/issues/981

根据@VPfB的建议,使用UUID UUID是通用唯一标识符的缩写。 从技术上讲,这些ID只能与用于存储它们的可用位空间一样唯一。 传统上,UUID是128位。 有关该主题Wikipedia文章讨论了它们的独特性

为了正确理解这些数字,估计某人被陨石击中的年风险是170亿的一次机会,这意味着该概率约为0.00000000006(6×10-11),等于创造机会的几率。一年中有数十万亿个UUID,并且有一个重复项。 换句话说, 只有在接下来的100年中每秒生成10亿个UUID之后才创建一个副本的可能性约为50%。

一种替代解决方案是使用专用系统来生成序列(类似于生成主键的数据库)。 该系统实质上是防弹计数器。 当某些东西需要一个ID时,它将向系统查询下一个可用ID。 当系统收到对新ID的查询时,它将增加计数器并提供新值。 这样安排的目的是,更新计数器,获取新值并存储当前状态(针对诸如电源故障之类的问题)的动作是原子性的。

例如在连接不良的分布式系统的情况下,计数器系统的想法可能不切实际。 这是需要UUID的主要情况:在多个不同的,未连接的系统中生成ID的能力非常高,不会发生冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM