You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本生成唯一ID:每次运行不同,同运行内全局一致

解决Python进程级唯一固定ID的需求

嘿,这个需求我太熟悉了!之前也踩过uuid的坑——每次调用uuid.uuid4()都生成新值,完全满足不了「同进程内无论怎么调用都返回同一个ID」的要求。咱们来一步步实现符合你所有要求的方案:

核心思路

你的需求本质是要每个脚本进程拥有一个全局唯一且固定的ID:

  • 进程启动时生成一次,进程内所有调用复用这个ID
  • 不同进程(多实例、多次运行)生成不同的ID

Python的模块特性刚好能完美解决这个问题:模块在一个进程中只会被导入一次,模块级的变量会在第一次导入时初始化,之后一直存在于进程的内存中,不管多少类、线程引用都不会重新生成。

实现代码

首先创建一个专门的模块(比如process_id.py),在模块加载时生成唯一ID,之后提供一个获取ID的函数:

# process_id.py
import uuid

# 模块第一次导入时生成ID,进程内全局唯一,永远不会再改变
_process_unique_id = str(uuid.uuid4())

def get_process_unique_id() -> str:
    """返回当前进程的唯一固定ID"""
    return _process_unique_id

然后在你的业务代码里,不管是类、线程还是其他地方,直接导入调用就行:

# 示例使用
from process_id import get_process_unique_id

# 类中调用
class ServiceA:
    def __init__(self):
        self.process_id = get_process_unique_id()
        print(f"ServiceA 拿到的进程ID: {self.process_id}")

class ServiceB:
    def log_process_id(self):
        print(f"ServiceB 拿到的进程ID: {get_process_unique_id()}")

# 多线程测试
import threading
def thread_task():
    print(f"线程中拿到的进程ID: {get_process_unique_id()}")

if __name__ == "__main__":
    # 主进程调用
    print(f"主进程ID: {get_process_unique_id()}")
    
    # 实例化多个类
    a = ServiceA()
    b = ServiceB()
    b.log_process_id()
    
    # 启动多线程
    t1 = threading.Thread(target=thread_task)
    t2 = threading.Thread(target=thread_task)
    t1.start()
    t2.start()
    t1.join()
    t2.join()

为什么满足你的所有要求?

  • 每次运行脚本生成不同ID:每次启动新进程时,模块会重新导入,_process_unique_id会重新生成一个全新的UUID,所以每次运行的ID都不一样。
  • 同一次运行中所有调用ID一致:模块在进程内只会初始化一次ID,不管多少类实例化、多少线程调用get_process_unique_id(),返回的都是同一个值——哪怕之前的对象引用失效,模块变量依然存在,ID不会改变。
  • 多实例拥有独立ID:每个进程有自己独立的模块空间,各自生成的ID完全独立,互不干扰。

可选优化

如果你觉得UUID太长,可以换成更短的标识,比如结合进程ID和时间戳:

import os
import time

_process_unique_id = f"{os.getpid()}-{int(time.time() * 1000)}"

不过UUID的唯一性更可靠,推荐优先使用。

内容的提问来源于stack exchange,提问作者sprad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:54:02