查询:Python 有没有办法说:
不要使用
/dev/shm
进行共享内存存储,而应使用其他临时位置,例如/tmp
。 或使用
threading.Lock
代替multiprocessing.SemLock
进行同步(如果可行且不合逻辑的话)。
背景:
我正在 ESX(虚拟机管理程序)上运行一个简单的 multiprocessing.Pool
示例,该示例运行到 OSError : Function not implemented error .
StackOverflow 上对此问题的其他提及( here 和 here )指出,当 /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/