目录

一、适用场景

二、文件锁

三、实现代码


一、适用场景

        适用于任何的只想让程序在一个载体上只能运行一个实例的情况,避免重复运行。这时候我们可以使用一些技术手段来控制,最简单的一个方法就是使用文件锁。

二、文件锁

        文件锁的基本思路是在程序启动时,在用户文件夹下新建一个文件锁,若文件锁不存在则启动程序并创建一个文件锁;文件存在即程序已启动,再次启动可以阻止程序启动并给出相应交互提示。

三、实现代码

        简单写法,在with lock后调用程序启动函数即可,进阶写法是可以把文件锁封装成一个函数,传入启动函数及参数,然后在获取到锁后调用回调函数即可。

from filelock import FileLock
import os

# 这里会在用户目录文件夹下创建一个tmp文件夹,里面会创建一个programLock.lock文件锁,这里可以更改路径或文件名称
rootPath = os.path.expanduser('~')
lockPath = os.path.sep.join([rootPath, 'tmp', 'programLock.lock'])

# 创建fileLock对象
lock = FileLock(lockPath, timeout=1)

try:
    # lock.acquire(timeout=1)
    with lock:
        # 调用程序启动函数
        pass
except Exception as e:
    print('启动失败,禁止启动多个实例')

        进阶写法,这样就可以在其他文件引入runMainOnLock函数,传入回调函数、函数参数。注意传入一个无返回值的回调函数,若实际场景需要接收返回值,可以再包一个函数传入。

from typing import Callable
from filelock import FileLock
import os

# 这里会在用户目录文件夹下创建一个tmp文件夹,里面会创建一个programLock.lock文件锁,这里可以更改路径或文件名称
rootPath = os.path.expanduser('~')
lockPath = os.path.sep.join([rootPath, 'tmp', 'programLock.lock'])

# 创建文件锁对象
lock = FileLock(lockPath, timeout=1)

def runMainOnLock(call: Callable=None, *args, **kwargs) -> None:
    try:
        with lock:
            if call:
                # 调用回调函数
                call(*args, **kwargs)
    except:
        print('启动失败,禁止启动多个实例')

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐