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

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

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

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

一些无关紧要的问题:

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

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

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

最佳答案

根据@VPfB的建议,使用UUID 。 UUID 是 Universally Unique Identifier 的缩写。从技术上讲,ID 的唯一性取决于用于存储它们的可用位空间。传统上,UUID 是 128 位。 Wikipedia article on the topic discusses their uniqueness :

To put these numbers into perspective, the annual risk of a given person being hit by a meteorite is estimated to be one chance in 17 billion, which means the probability is about 0.00000000006 (6 × 10−11), equivalent to the odds of creating a few tens of trillions of UUIDs in a year and having one duplicate. In other words, only after generating 1 billion UUIDs every second for the next 100 years, the probability of creating just one duplicate would be about 50%.

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

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

关于python - 如何在跨多个进程的 Python 类中创建唯一 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33076453/

相关文章:

Python 守护进程不会在 Ubuntu 的后台运行

python - 如何编写网络协议(protocol)处理程序

python - 运行 ".py",不要在带有 Anaconda 的 Ubuntu 中输入 'python'

python - 如何在 Python3 中发送带有样式的电子邮件?

mysql - 如何在 MySQL 中使用 Fluent Migrator 自动生成 UUID/GUID?

MySQL JOIN ON 子查询?

python - 在没有 elasticsearch-py 的情况下将 pandas 数据框索引到 Elasticsearch

Python 高效地从 XML 中提取嵌套元素

python - 特定 Enum 值的类型注释

postgresql - 在 Postgres 中生成非碎片 UUID?