如何在Python

时间:2017-02-13 14:25:24

标签: python synchronization multiprocessing shared-memory hypervisor

查询:Python中有什么方法可以说:

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

  • 而不是multiprocessing.SemLock使用threading.Lock进行同步(如果可行且不合逻辑)。

背景

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

StackOverflow上针对此问题的其他提及(herehere)已指出它在未挂载/dev/shm时发生。由于这个原因,_multiprocessing.SemLock无法创建同步锁。

对我来说实际情况是ls -lrt /dev/shm对我失败了。但是,我不能尝试上面链接推荐的解决方案

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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