簡體   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