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

# 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中,多进程和多线程写同一个TXT文件会存在丢失、混乱等问题,需要使用同步机制来解决。下面是一些常用的同步机制: 1. 互斥(`Lock`):在多个进程或线程访问同一资源时,使用互斥可以保证同一时刻只有一个进程或线程能够访问资源。在Python中可以使用`multiprocessing.Lock`或`threading.Lock`来创建互斥。 2. 信号量(`Semaphore`):信号量可以用来控制同时访问某一资源的进程或线程数量。在Python中可以使用`multiprocessing.Semaphore`或`threading.Semaphore`来创建信号量。 3. 条件变量(`Condition`):条件变量可以用来控制进程或线程的执行顺序,可以让某些进程或线程等待某些条件满足后再执行。在Python中可以使用`multiprocessing.Condition`或`threading.Condition`来创建条件变量。 下面是一个使用互斥来解决多进程和多线程写同一个TXT文件的示例代码: ```python import multiprocessing import threading def write_file(lock, filename, content): with lock: with open(filename, 'a') as f: f.write(content) if __name__ == '__main__': filename = 'test.txt' content = 'hello world\n' lock = multiprocessing.Lock() # 或者 threading.Lock() # 多进程文件 p1 = multiprocessing.Process(target=write_file, args=(lock, filename, content)) p2 = multiprocessing.Process(target=write_file, args=(lock, filename, content)) p1.start() p2.start() p1.join() p2.join() # 多线程写文件 t1 = threading.Thread(target=write_file, args=(lock, filename, content)) t2 = threading.Thread(target=write_file, args=(lock, filename, content)) t1.start() t2.start() t1.join() t2.join() ``` 在这个示例中,我们使用了`multiprocessing.Lock`或`threading.Lock`来创建一个互斥,确保同时只有一个进程或线程能够访问文件。在`write_file`函数中,我们使用`with lock`语句来获取互斥,确保同一时刻只有一个进程或线程能够写入文件。在实际应用中,还需要考虑其他同步机制的使用,以保证多进程或多线程操作文件的正确性和效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值