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

标签 python sql mod-wsgi

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

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/

相关文章:

python - Matplotlib 曲面图不直观的三角剖分

sql - 在 SQL Server 中保存重音字符

Mysql查询按部分获取最大年龄,如果两个或多个具有相同年龄,则返回具有最小id的学生

python - 目标 WSGI 脚本无法作为 Python 模块加载

python - 运行 Apache + Bottle + Python

Python:尝试除了 KeyError 与 if has_key()

python - Python 中的浮点对象不可调用错误

python - 从 2D 数组中沿 axis=0 滑动的滑动窗口给出具有动态重叠的 3D 数组

sql - 将一列中的值解析为另一个表中的多列

python - 带有 wsgi 的 Django 偶尔失败并显示 "Premature end of script headers:"