我尝试使用共享内存作为系统管理的唯一资源来确保单实例,并认为共享内存是一个不错的选择。这是代码
import multiprocessing.shared_memory as share_mem
import sys
def isRunning(name: str) -> bool:
try:
shm = share_mem.SharedMemory(name, False)
shm.close()
return True
except FileNotFoundError as e:
return False
def runInstance(name: str) -> share_mem.SharedMemory:
return share_mem.SharedMemory(name, True, 1)
NAME = 'foo.bar'
if isRunning(NAME):
print('Already launched, exit')
sys.exit(1)
print('Launching instance')
shm = runInstance(NAME)
print('Running')
input('Press key')
print('Quitting')
shm.close()
shm.unlink()
在 Windows 上它运行完美。在 Debian 11 上发生了神秘的错误:
python3 si.py
,它启动并等待输入python3 si.py
,它报告实例正在运行并退出python3 si.py
,它就启动了!看起来第二个实例以某种方式取得了所有权并关闭了共享内存,即使是第一个实例也是如此。
此外,在另一种尝试中,两个实例同时运行良好(因此两种错误的行为会相互改变,但正确的行为永远不会发生)。
我做错了什么,还是 Python 或操作系统中的错误?我在 Debian 11 上使用 Py 3.9.2。
您描述的问题可能是由于多个实例之间管理和关闭共享内存的方式造成的。以下是有关如何修改代码的可能解释和建议:
解决此问题的一种方法是使用锁或信号量来确保一次只有一个实例可以控制共享内存。这可以防止多个实例同时访问或关闭共享内存。
import multiprocessing.shared_memory as share_mem
import sys
import multiprocessing
def isRunning(name: str) -> bool:
try:
shm = share_mem.SharedMemory(name, False)
shm.close()
return True
except FileNotFoundError:
return False
def runInstance(name: str) -> share_mem.SharedMemory:
return share_mem.SharedMemory(name, True, 1)
def main():
NAME = 'foo.bar'
if isRunning(NAME):
print('Already launched, exit')
sys.exit(1)
lock = multiprocessing.Lock()
with lock:
print('Launching instance')
shm = runInstance(NAME)
print('Running')
input('Press key')
print('Quitting')
shm.close()
shm.unlink()
if __name__ == '__main__':
main()
请尝试一下这种方法,看看它是否可以解决您在 Debian 上使用共享内存时遇到的问题