gpt4 book ai didi

python - 如何在多进程和多线程环境中生成随机唯一标识符?

转载 作者:太空宇宙 更新时间:2023-11-03 12:19:55 25 4
gpt4 key购买 nike

我提出的每个解决方案都不是线程保存。

def uuid(cls,db):
u = hexlify(os.urandom(8)).decode('ascii')
db.execute('SELECT sid FROM sessions WHERE sid=?',(u,))
if db.fetch(): u=cls.uuid(db)
else: db.execute('INSERT INTO sessions (sid) VALUES (?)',(u,))
return u

最佳答案

import os, threading, Queue

def idmaker(aqueue):
while True:
u = hexlify(os.urandom(8)).decode('ascii')
aqueue.put(u)

idqueue = Queue.Queue(2)

t = threading.Thread(target=idmaker, args=(idqueue,))
t.daemon = True
t.start()

def idgetter():
return idqueue.get()

队列通常是在 Python 中同步线程的最佳方式——这种情况足够频繁,以至于在设计多线程系统时,您的第一个想法应该是“我怎样才能最好地使用队列来做到这一点”。基本思想是将一个线程专用于完全“拥有”共享资源或子系统,并让所有其他“工作”线程仅通过获取和/或放入该专用线程使用的队列来访问资源(队列本质上是线程安全的) .

这里,我们做了一个长度只有2的idqueue(我们不希望id的生成很乱,事先做了很多id,浪费内存,耗尽熵池-- 不确定 2 是否是最优的,但最佳点肯定是一个非常小的整数;-),因此 id 生成器线程将在尝试添加第三个时阻塞,并等待直到在队列中打开一些空间。 idgetter(也可以简单地由顶级分配定义,idgetter = idqueue.get)通常会找到一个已经存在的 id 并等待(并为下一个!)——如果没有,它本质上会阻塞并等待,一旦 id 生成器将新 id 放入队列中就会唤醒。

关于python - 如何在多进程和多线程环境中生成随机唯一标识符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com