Gel*_*ler 7 random pypy guid multiprocessing python-3.x
我用 Python 开发了一个性能关键且 CPU 密集型的应用程序。为了达到可接受的性能,我使用 PyPy 和使用 os.fork 生成的多个进程。总的来说,我现在对接近编译语言的性能感到满意。但我最初使用的时候必须生成很多 GUID:
\n\nimport uuid\nprint(str(uuid.uuid4()))\nRun Code Online (Sandbox Code Playgroud)\n\n生成 UUID。但分析显示,UUID 生成约占总运行时间的 20%。这似乎是由于对os.urandom()in的调用uuid.uuid4()在某些系统(包括 OS\xc2\xa0X)上似乎很慢。然后我替换os.urandom()为random.getrandbits():
import random\n str(UUID(int=random.getrandbits(128), version=4))\nRun Code Online (Sandbox Code Playgroud)\n\n这很快。但现在事实证明我的并行运行工作进程大量生成重复的 GUID。
\n\n我怀疑 python 的伪数生成器是用当前时间作为种子的,这就是为什么不同的进程会生成相同的随机数。我能想到的一种可能的修复方法是将进程 ID 包含到数字生成器的种子中。但由于我不太确定 uuid 和随机包是如何在内部构建的,所以我不确定这是否足以防止冲突。我发现了一些作为 c 扩展编写的替代 UUID 实现,但由于 PyPy 我无法使用它们。
\n\n由于某些库的原因,我只在这个项目中使用 python,而且我在 python 中编码的经验很少。
\n\n更新:
\n\n现在我已经seed(SystemRandom().getrandbits(128))在分叉后添加了。因此使用 /dev/urandom 播种 PRNG。到目前为止,这似乎运作良好。
我喜欢 rossum 提出的用主进程 RNG 为子进程播种的想法。但现在想起来,我想使用操作系统的 RNG 来播种 RNG 应该更安全。特别是,因为我的应用程序还分布在多个节点上运行。恕我直言,用 mac 地址和时间戳播种初始 RNG,然后使用 rossums 提案应该也可行。
\n发生这种情况是因为进程分叉导致每个进程都有相同内存的副本,包括相同 PRNG 状态的副本。相反,在 fork 之后重新播种SystemRandom可以解决这个问题,因为 提供的随机数SystemRandom对于操作系统来说是全局的,而不是对于单个进程来说。
| 归档时间: |
|
| 查看次数: |
3678 次 |
| 最近记录: |