Python通过文件锁实现同一时刻只能有一个进程在运行某项任务(Windows平台)

该代码实现了一个Python类`SingleInstanceGuardian`,用于确保同一时间只有一个实例运行。它通过创建并锁定一个文件来实现进程间的同步,如果检测到锁已被其他实例持有,则认为已有应用在运行并退出。`run_task`方法执行任务,在任务完成后释放文件锁。依赖`pywin32`库。
摘要由CSDN通过智能技术生成
# coding: utf-8
import win32con
import win32file
import pywintypes
import winerror
import sys


class SingleInstanceGuardian:
    def __init__(self, lock_file_path):
        self._lock_file_path = lock_file_path
        self._lock_file = None

    def _acquire_lock(self):
        try:
            # 创建一个文件用于锁定
            self._lock_file = win32file.CreateFile(
                self._lock_file_path,
                win32file.GENERIC_WRITE,
                0,
                None,
                win32file.CREATE_ALWAYS,
                win32file.FILE_ATTRIBUTE_NORMAL,
                None
            )

            # 尝试获取文件锁
            win32file.LockFileEx(self._lock_file, win32con.LOCKFILE_EXCLUSIVE_LOCK | win32con.LOCKFILE_FAIL_IMMEDIATELY, 0, -0x10000, pywintypes.OVERLAPPED())

            return True
        except pywintypes.error as e:
            if e.winerror == winerror.ERROR_LOCK_VIOLATION:
                return False
            else:
                raise

    def _release_lock(self):
        if self._lock_file:
            win32file.UnlockFileEx(self._lock_file, 0, -0x10000, pywintypes.OVERLAPPED())
            win32file.CloseHandle(self._lock_file)

    def is_already_running(self):
        return not self._acquire_lock()

    def run_task(self):
        if self.is_already_running():
            print("Another instance is already running.")
            sys.exit(1)

        # 执行任务代码

        # 任务完成后释放锁
        self._release_lock()


# 使用示例
lock_file_path = r"D:\lock_file.lock"
guardian = SingleInstanceGuardian(lock_file_path)
guardian.run_task()

说明: 依赖于 pywin32 模块,安装 pip install pywin32

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值