如何跨多个进程在 Python Class 中创建唯一 ID
How to create a unique ID in a Python Class across multiple processes
我想编写一个对象,在实例化时为每个实例生成一个新 ID。但是这个 ID 必须是
- 以线程和进程安全的方式生成
- 甚至跨进程也是唯一的(通过多处理产生)
一些不关心的问题:
- 这个特定的对象创建不是性能关键,因此由此带来的同步开销是可以接受的。
- ID 不能是连续的,但通常会附带一个干净的解决方案。
- 我们无知到根本不在乎python2。
已经有一些解决方案只适用于 one process,最优雅的是使用 itertools.count()
对象。使用 id()
是不可行的,因为它不能保证是唯一的。理想的解决方案可能是与 itertools.count()
类似的对象,它在进程中拥有一些静态全局值。
我们项目的相关讨论:https://github.com/coala-analyzer/coala/issues/981
根据@VPfB 的建议,使用 UUID. UUID is an acronym for Universally Unique Identifier. Technically, the ids can only be as unique as the available bit space used to store them. Traditionally UUID are 128 bits. The 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 的能力非常高,不会发生冲突。
我想编写一个对象,在实例化时为每个实例生成一个新 ID。但是这个 ID 必须是
- 以线程和进程安全的方式生成
- 甚至跨进程也是唯一的(通过多处理产生)
一些不关心的问题:
- 这个特定的对象创建不是性能关键,因此由此带来的同步开销是可以接受的。
- ID 不能是连续的,但通常会附带一个干净的解决方案。
- 我们无知到根本不在乎python2。
已经有一些解决方案只适用于 one process,最优雅的是使用 itertools.count()
对象。使用 id()
是不可行的,因为它不能保证是唯一的。理想的解决方案可能是与 itertools.count()
类似的对象,它在进程中拥有一些静态全局值。
我们项目的相关讨论:https://github.com/coala-analyzer/coala/issues/981
根据@VPfB 的建议,使用 UUID. UUID is an acronym for Universally Unique Identifier. Technically, the ids can only be as unique as the available bit space used to store them. Traditionally UUID are 128 bits. The 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 的能力非常高,不会发生冲突。