【问题标题】:How to create a unique ID in a Python Class across multiple processes如何跨多个进程在 Python 类中创建唯一 ID
【发布时间】:2015-10-12 08:25:58
【问题描述】:

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

  • 以线程和进程安全的方式生成
  • 即使跨进程也是唯一的(通过多处理产生)

一些无关紧要的事情:

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

已经有一些解决方案只适用于one process,最优雅的是使用itertools.count() 对象。使用id() 不是选项,因为它不能保证是唯一的。理想的解决方案可能是与 itertools.count() 类似的对象,它在进程中拥有一些静态全局值。

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

【问题讨论】:

  • @VPfB 这属于当前使用(哈希)的类别,几乎是独一无二的。 (感谢您提出这个建议,我实际上会更改我们的实现以使用 UUID。)我是一个非常理想主义的人,我很想采用一个保证唯一性的解决方案。

标签: python python-3.x uuid python-multiprocessing


【解决方案1】:

按照@VPfB 的建议,使用UUID。 UUID 是Universally Unique Identifier 的首字母缩写。从技术上讲,id 只能与用于存储它们的可用位空间一样唯一。传统上,UUID 是 128 位。 Wikipedia article on the topic discusses their uniqueness

从这些数字来看,一个人被陨石击中的年风险估计为 170 亿分之一,这意味着概率约为 0.00000000006 (6 × 10−11),相当于一年内创建数十万亿个 UUID 并复制一个的可能性。换言之,仅在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%。

另一种解决方案是使用专用系统生成序列(类似于数据库生成主键)。该系统本质上是一个防弹计数器。当某物需要 ID 时,它会向系统查询下一个可用 ID。当系统收到对新 ID 的查询时,它会增加计数器并提供新值。它将被安排为更新计数器、获取新值和存储当前状态(针对电源故障等问题)的行为是原子的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多