Python:使用互斥锁的Windows上的单个程序实例

时间:2016-01-25 09:32:16

标签: python singleton mutex

我在python中使用py2exe创建了一个可执行文件 我正在看这个post但不幸的是答案是肤浅的 使用Tendo的第一个解决方案,但这可以限制每个用户的1个应用程序实例,我的应用程序正在Windows Server环境中使用,一次有20个以上的用户。 提供的第二个解决方案Listening to a defined port没有示例说明如何实现它 所以我决定使用互斥锁来防止我的应用程序多次运行 所以我目前使用此code来使用互斥锁,但它在应用程序和服务之间没有互斥检测。
这个post显示了如何完成互斥锁,但没有显示它是如何在python中完成的。
我如何使用互斥锁在Windows上安装单个程序实例,其中互斥体不限制Windows上的单个程序实例,并且在应用程序和服务之间进行检测。

1 个答案:

答案 0 :(得分:1)

我不确定您为什么必须在Windows上使用互斥锁来实现此目的?有一个更简单的选择:一个糟糕的旧锁文件。

如果要实现的 all 确保只运行应用程序的单个实例,则可以执行以下操作:

Windows支持您,因为如果文件被另一个进程打开,您将无法删除该文件。所以(代码未经测试):

tempdir = tempfile.gettempdir()
lockfile = os.sep.join([tempdir, 'myapp.lock'])
try:
    if os.path.isfile(lockfile):
        os.unlink(lockfile)
except WindowsError as e: # Should give you smth like 'WindowsError: [Error 32] The process cannot access the file because it is being used by another process..'   
    # there's instance already running
    sys.exit(0)

with open(lockfile, 'wb') as lockfileobj:
    # run your app's main here
    main()
os.unlink(lockfile)

with部分可确保在main运行时打开文件,并在main完成运行时关闭该文件。然后os.unlink删除锁文件。

如果另一个实例尝试启动,它会在WindowsError异常时退出(最好检查一下它的数字代码,但要确定它是否已经打开了文件)。 / p>

上面是一个粗略的解决方案,如果出于任何原因main退出,则可以使用进入/退出功能删除锁定文件。这里的解释:http://effbot.org/zone/python-with-statement.htm