python - UUID 对于 Centos 操作系统上的不同进程保持不变,但在 Windows

我有两个在 Python 3.9 中运行的源文件。 (文件很大...)

文件一(fileOne.py)

# ...
sessionID = uuid.uuid4().hex
# ...

文件二(fileTwo.py)

# ...
from fileOne import sessionID
# ...

文件二使用模块多处理执行。

  • 当我在本地机器上运行并在文件二中打印 UUID 时,它始终是唯一的。
  • 当我在 Centos OS 上运行脚本时,它以某种方式保持不变
  • 如果我重新启动服务,UUID 将更改一次。

我的问题:为什么这可以按预期在本地(Windows 操作系统)运行,但不能在 CentOS VM 上运行?

更新 1.0: 说清楚。

对于每个单独的进程,我需要 UUID 在 FileOne 和 FileTwo 中是相同的。这意味着

  • processOne = 文件一和文件二中的 UUID 将为 1q2w3e
  • processTwo = 文件一和文件二中的 UUID 将为 r4t5y6(不同的一个)

最佳答案

您的谜语很可能是由多处理在不同操作系统中的工作方式引起的。你没有提到,但你的“本地运行”肯定是 Windows 或 MacOS,而不是 Linux 或其他 Unix Flavor。

问题是 Linux 上的多处理(以及之前在 MacOS 上,但在 Python 3.8 上改变了它),在使用多处理时使用了系统 fork 调用:当前进程是 duplicatesd” “按原样”及其所有定义的变量和类 - 因为您的 sessionID 是在导入时定义的,所以它在所有子进程中保持不变。

Windows 缺少 fork 调用,并且 multiprocessing 求助于启动一个新的 Python 解释器,该解释器从当前进程重新导入所有模块(这导致另一个更常见的混淆原因,其中任何代码不受 if __name__ == "__main__": 的保护 Python 文件重新执行)。在您的情况下,将重新生成 sessionID 的值。

查看文档:https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods

因此,如果您希望变量在运行多进程时可靠地运行并且在所有进程中具有相同的值,您应该将它作为参数传递给其他进程中的目标函数,或者使用适当的结构来共享此处记录的跨流程值: https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes

(您也可以查看最近关于同一主题的问题:why is a string printing 3 times instead of 1 when using time.sleep with multiprocessing imported?)

如果您需要为每个不同的进程提供跨文件的唯一 ID: (从编辑和评论中可以更清楚地看出)

有一个全局(普通)字典,它将作为每个进程的 ID 注册表,并使用一个函数来检索 ID - 该函数可以使用 os.getpid() 作为注册表的关键。

文件 1:

import os
import uuid
...
_id_registry = {}

def get_session_id():
    return _id_registry.setdefault(os.getpid(), uuid.uuid4())

文件2:

from file1 import get_session_id

sessionID = get_session_id()

(setdefault dict 方法负责提供一个新的 ID 值,如果没有设置的话)

注意:以这种方式设置的注册表将最多保留主进程 ID(如果多进程正在使用 fork 模式)和它自己 - 没有 sibling 的数据,因为每个进程都将保留它自己的注册表副本。如果您需要一个工作的进程间字典(例如,它可以为所有进程保存一个实时注册表),您可能最好使用 redis(https://redis.io - 当然其中一个 Python 绑定(bind)具有透明的 Python 映射 - over-redis,所以你不必担心它的语义)

关于python - UUID 对于 Centos 操作系统上的不同进程保持不变,但在 Windows 操作系统上运行良好(每个进程流的 UUID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69046610/

相关文章:

regex - 下一个单词的 GREP 跟随包含变量的字符串

node.js - 如何在 nodejs 中使用 getRandomValues()?

reactjs - 如何防止我内存的 React 组件在 React DevTools 中显示为 "

rust - 为什么可以在 String 上调用 Colorize trait 方法,而 Strin

r - 如果字符串包含 x 在 R 中做 y

javascript - $(this) 在我的 jQuery 点击函数中不起作用

python - 如何将第一列的值分成另外两列

swiftui - PresentationMode 触发器 "Variable X used be

python - Colab 中没有名为 'statsmodels.tsa.arima' 的模块,但

python - 您如何为加权平均平均值迭代地为数据框列赋予权重?