我提出的每个解决方案都不是线程保存。
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/