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



我在python中使用py2exe创建了一个可执行文件。
我正在看这篇文章,但不幸的是答案是肤浅的。
使用Tendo的第一个解决方案,但这适用于限制每个用户1个应用程序实例,并且我的应用程序正在一次登录20 +用户的Windows服务器环境中使用。
提供的第二个解决方案侦听定义的端口没有如何完成的示例。
所以我决定使用互斥锁来防止我的应用程序多次运行。
所以我目前使用此代码来使用互斥锁,但它在应用程序和服务之间没有互斥体检测。
这篇文章展示了如何完成互斥锁,但没有展示它在python中是如何完成的。
我如何使用互斥体在Windows上具有单个程序实例,其中互斥锁不限制Windows上的单个程序实例,并且在应用程序和服务之间进行检测。

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

如果你想要实现的只是确保只有一个应用实例运行,你可以执行以下操作:

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异常时退出(最好检查其数字代码以确保它恰好是文件已经打开的情况)。

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

最新更新