在Python中预生成GUID?
我有一个Python程序,需要生成几个唯一标识符(guid),然后把这些标识符和其他一些数据通过网络返回给客户端。这个程序可能会在短时间内接收到很多请求,我希望响应的延迟尽可能低。
理想情况下,我不想在客户端等待响应的时候临时生成新的guid,而是希望在后台批量生成一份guid列表,并不断补充,这样我就总是有现成的guid可以发给客户端。
我在Linux上使用Python的uuid模块。我知道这个模块是通过uuidd这个守护进程来获取uuid的。请问uuidd是否已经处理了预生成uuid的事情,以确保总是有一些现成的?从文档来看,它似乎并没有这样做。
在Python或者uuidd中有没有什么设置可以让它自动做到这一点?有没有比在我的程序中手动创建一个后台线程来维护uuid列表更优雅的方法?
3 个回答
0
假设你有一个线程在不停地往一个UUID池里添加新的UUID。
下面是一个非常简单的例子:
import uuid,threading,time
class UUID_Pool(threading.Thread):
pool_size=10000
def __init__(self):
super(UUID_Pool,self).__init__()
self.daemon=True
self.uuid_pool=set(uuid.uuid1() for x in range(self.pool_size))
def run(self):
while True:
while len(self.uuid_pool) < self.pool_size:
self.uuid_pool.add(uuid.uuid1())
time.sleep(0.01) # top up the pool 100 times/sec
uuid_pool = UUID_Pool()
uuid_pool.start()
get_uuid = uuid_pool.uuid_pool.pop # make a local binding
uuid=get_uuid() # ~60x faster than uuid.uuid1() on my computer
你还需要处理一种情况,就是如果你使用UUID的速度比线程生成它们的速度快,可能会导致池子里的UUID用完。
4
我测试了uuid模块生成uuid的性能:
>>> import timeit
>>> timer=timeit.Timer('uuid.uuid1()','import uuid')
>>> timer.repeat(3, 10000)
[0.84600019454956055, 0.8469998836517334, 0.84400010108947754]
你需要多少个?每秒10000个不够吗?
6
你确定 uuid
模块真的会太慢,无法及时处理你预期的请求吗?如果 UUID 生成成为你应用的瓶颈,我会感到非常惊讶。
我建议你先构建一个简单的应用,直接使用 uuid
模块。如果你发现这个模块确实让事情变慢了,那你可以考虑保持一个预先生成的 UUID 列表,以便使用。