Python实现脚本单实例运行的装饰器方案

码头散步
码头散步
发布时间:2026-10-12| 2人浏览过
原创

本文介绍如何通过Socket监听本机特定端口的方式,防止同一Python脚本被重复执行。利用自定义装饰器封装地址绑定检测逻辑,可自动拦截已启动的进程,确保核心业务仅保留单一运行实例,适用于定时任务、后台服务及防重跑场景。

单实例运行原理与准备条件

在操作系统网络栈中,同一主机的同一协议与端口组合在同一时间只能被一个进程绑定。当脚本启动时尝试占用指定端口,若绑定成功即证明当前无重复实例;若绑定失败抛出异常,则说明端口已被占用,原有实例仍在运行。该方法无需依赖第三方库,仅需标准socket模块即可实现。

使用前请确认以下前提:

  • 运行环境为支持标准Python语法的任意版本(推荐3.6+)。
  • 主机防火墙未拦截该端口的回环通信。依赖socket.gethostname()进行本机标识。
  • 目标脚本需具备独立入口函数,便于通过装饰器包裹。

装饰器实现单实例拦截

第1步:编写端口检测装饰器

将端口监听逻辑封装为高阶函数,通过@functools.wraps保留原函数的签名与注释信息。目的为统一拦截重复拉起,入口为新建或编辑目标.py文件顶部。动作为初始化流式套接字并尝试绑定(host, 60123),关键参数为主机名与固定端口。可观察的完成状态为装饰器函数返回wrapper引用,可挂载至任意业务函数。

import functools
import socket

def just_one_instance(func):
    """装饰器:如果已经有实例在跑则退出"""
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        try:
            # 保持Socket对象全局存活,防止GC回收导致端口释放
            global _single_instance_sock
            _single_instance_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            host = socket.gethostname()
            _single_instance_sock.bind((host, 60123))
        except OSError:
            print('already has an instance')
            return None
        return func(*args, **kwargs)
    
    return wrapper

第2步:在目标函数上应用装饰器

将上述装饰器直接作用于实际执行业务逻辑的主函数。目的是让框架自动完成前置检查,入口为脚本的`if __name__ == '__main__':`分支。动作为声明函数体并在其上方添加@just_one_instance,参数沿用小括号默认透传。可观察的完成状态为首次运行触发主逻辑,二次运行终端打印拦截提示且无后续报错。

@just_one_instance
def main():
    print('Starting single instance job...')
    # 此处填写你的核心业务逻辑
    pass

if __name__ == '__main__':
    main()

完成判断与排错指南

执行脚本后,终端输出包含already has an instance即表示拦截生效,新进程已安全退出。若需验证是否真正复用唯一实例,可并行运行两次相同脚本观察现象。以下为常见异常排查方向:

  • 绑定失败但无其他实例运行:可能因上次脚本非正常退出(如强制Kill或断电)导致内核端口残留。重启服务节点或等待TCP TIME_WAIT状态过期后可恢复。
  • hostname解析异常或阻塞:部分容器化或静态化环境gethostname()返回值复杂导致DNS解析延迟。可将(host, 60123)替换为('127.0.0.1', 60123)提升兼容性。
  • 端口冲突风险:若本机已有其他软件占用60123端口,请更换为高位空闲端口(建议使用10000~65535区间内未被占用的数字)。

以上就是Python实现保证只能运行一个脚本实例的详细内容,更多关于Python单实例控制与装饰器应用的技术资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。