2

私は、いくつかの GUID を生成し、それらを他のデータとともにネットワーク経由でクライアントに返す必要がある 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]

いくつ必要でしょうか?1 秒あたり 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 に答える