Предварительная генерация GUID для использования в Python? - PullRequest
2 голосов
/ 09 апреля 2010

У меня есть программа на Python, которая должна сгенерировать несколько направляющих и передать их вместе с некоторыми другими данными клиенту по сети. Это может быть связано с большим количеством запросов за короткий промежуток времени, и я хотел бы, чтобы задержка была настолько низкой, насколько это возможно.

В идеале, вместо того, чтобы генерировать новые направляющие на лету, пока клиент ожидает ответа, я бы предпочел массово генерировать список направляющих в фоновом режиме, который постоянно пополняется, чтобы у меня всегда были предварительно сгенерированные, готовые раздаточный материал.

Я использую модуль uuid в python под Linux. Я понимаю, что это использует демон uuidd для получения uuids. Uuidd уже позаботился о предварительной генерации uuids, чтобы он всегда был готов? Из документации видно, что это не так.

Есть ли какие-то настройки в python или с помощью uuidd, чтобы он делал это автоматически? Есть ли более элегантный подход, чем ручное создание фонового потока в моей программе, который поддерживает список uuids?

Ответы [ 3 ]

6 голосов
/ 09 апреля 2010

Вы уверены, что модуль uuid на самом деле будет слишком медленным для своевременной обработки ожидаемых вами запросов? Я был бы очень удивлен, если бы генерация UUID стала узким местом в вашем приложении.

Сначала я бы собрал приложение, чтобы просто использовать модуль uuid, а затем, если вы обнаружите, что этот модуль на самом деле замедляет работу, вы должны найти способ сохранить предварительно сгенерированный список UUID.

4 голосов
/ 09 апреля 2010

Я проверил производительность модуля uuid для генерации uuids:

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

Сколько тебе нужно? Разве 10000 в секунду недостаточно?

0 голосов
/ 09 апреля 2010

Предположим, у вас есть нить для пополнения пула 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 быстрее, чем поток может их сгенерировать.

...