预生成GUID用于python?

时间:2010-04-08 22:43:50

标签: python linux performance guid uuid

我有一个python程序需要生成几个guid并通过网络将其他一些数据传回客户端。它可能会在很短的时间内遇到很多请求,我希望延迟尽可能低。

理想情况下,我不想在客户端等待响应的情况下动态生成新的guid,而是在后台批量生成一个guid列表,这些guid会不断补充,以便我总是预先准备好的guid分发。

我在linux上使用python中的uuid模块。我知道这是使用uuidd守护进程来获取uuids。 uuidd是否已经开始处理pre-genreating uuids,以便它总是准备好了?从文档中可以看出它没有。

python或uuidd中是否有一些设置让它自动执行此操作?有没有更优雅的方法然后在我的程序中手动创建一个后台线程来维护一个uuids列表?

3 个答案:

答案 0 :(得分:6)

您确定uuid模块实际上太慢,无法及时处理您期望的请求吗?如果UUID生成占您应用程序的瓶颈,我会非常惊讶。

我首先构建应用程序以简单地使用uuid模块然后如果您发现此模块实际上减慢了速度,那么您应该研究一种方法来保留预先生成的UUID列表。< / p>

答案 1 :(得分:4)

我已经测试了用于生成uuids的uuid模块的性能:

>>> import timeit
>>> timer=timeit.Timer('uuid.uuid1()','import uuid')
>>> timer.repeat(3, 10000)
[0.84600019454956055, 0.8469998836517334, 0.84400010108947754]

你需要多少?每秒10000不够吗?

答案 2 :(得分:0)

假设你有一个线程来保持一个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比线程生成它们更快地清空池的情况。