python - 如何在 Python 中配置 `/dev/shm/` 或 `_multiprocessing.SemLock` 的替代方案

标签 python synchronization multiprocessing shared-memory hypervisor

查询:Python 有没有办法说:

  • 不要使用 /dev/shm 进行共享内存存储,而应使用其他临时位置,例如 /tmp

  • 使用 threading.Lock 代替 multiprocessing.SemLock 进行同步(如果可行且不合逻辑的话)。

背景:

我正在 ESX(虚拟机管理程序)上运行一个简单的 multiprocessing.Pool 示例,该示例运行到 OSError : Function not implemented error .

StackOverflow 上对此问题的其他提及( herehere )指出,当 /dev/shm 未安装时会发生这种情况。因此,_multiprocessing.SemLock无法创建同步锁。

这对我来说实际上是这样,因为 ls -lrt/dev/shm 对我来说失败了。但是我无法尝试上述链接中推荐的解决方案

  • mount 因为 mount 命令未在我运行的平台 (ESX/VMKernel) 上实现。

  • VM 不是持久性的,/etc/fstab 在关闭时会被冲走。

所以我正在寻找使用 threading.Lock() 进行同步或要求 Python 不要使用 /dev/shm/ 进行同步的方法。

最佳答案

如果您尝试在两个多处理进程中使用threading.Lock对象,这两个Lock对象将不会被链接。 threading.Lock 依赖于 2 个 Thread 将在同一内核上运行并共享文件描述符和 GIL 的事实。 2 Process 的情况并非如此。

模块_multiprocessing.semaphore依赖操作系统pthread.sem_open来创建SemLock对象。这意味着主要问题是:ESX 上是否实现了一些操作系统信号量?如果有,您可以使用 ctypes 和来自 loky.backend.semlock 的灵感来实现您自己的 SemLock 对象。 ,它允许您访问内部 pthread 原语。

请注意,可能需要大量工作才能确保 SemLock 与 multiprocessing 模块正确使用。解决方案可能是使用 loky 的修改版本,如果您在 ESX 上成功实现它,则使用此 SemLock

关于python - 如何在 Python 中配置 `/dev/shm/` 或 `_multiprocessing.SemLock` 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42206381/

相关文章:

python - 使用 Python/C API 传递 C 指针

java - Java 代码中的键盘/鼠标事件计时问题

ios - iOS是否有“公平”的同步机制

java - JAXB 和同步

python - 在pycharm中使用多处理时如何调试

python - 如何在python中使用多处理将df的内容写入csv文件

python - 动态更改函数 __name__ 会抛出 AttributeError : 'method' object has no attribute '__name__'

python - 将队列传递给线程池 - Python

带有工作进程的 python 池

python - Python 中的快速组合生成器