2

我有一个 python 程序,它需要生成几个 guid,并通过网络将它们与其他一些数据一起交还给客户端。它可能会在短时间内受到大量请求的影响,我希望延迟尽可能低。

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

我在 linux 上的 python 中使用 uuid 模块。我知道这是使用 uuidd 守护进程来获取 uuid。uuidd 是否已经处理了预生成的 uuid,以便它始终准备好一些?从文档看来,它没有。

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

4

3 回答 3

6

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

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

于 2010-04-08T22:47:56.360 回答
4

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

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

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

于 2010-04-08T22:51:46.827 回答
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 比线程生成它们的速度更快来处理突发清空池的情况。

于 2010-04-08T23:19:14.173 回答