当前位置: 首页 > article >正文

Python 中利用装饰器实现多线程函数调用示例

在 Python 的编程世界里,多线程的运用可以有效提升程序的执行效率,尤其在处理一些可以并行执行的任务时,显得格外重要。今天就和大家分享一个通过装饰器来便捷地实现多线程调用函数的小示例,以下是具体的代码讲解。

一、代码整体结构与功能概述

首先,我们导入了两个必要的模块:numpy(在本示例中虽然暂时没有实际用到它核心的功能,但在很多涉及数值计算等场景中经常配合使用,所以先导入备用)和threading,后者是 Python 标准库中用于实现多线程相关功能的模块。

import numpy as np
import threading
二、定义装饰器 threaded

接下来重点看一下自定义的装饰器函数 threaded,它的作用是能够将一个普通函数方便地转变为可以选择以多线程方式运行的函数。

def threaded(func):
    """
    Multi-threads a target function by default and returns the thread or function result.
    Use as @threaded decorator. The function runs in a separate thread unless 'threaded=False' is passed.
    """

    def wrapper(*args, **kwargs):
        """Multi-threads a given function based on 'threaded' kwarg and returns the thread or function result."""
        if kwargs.pop("threaded", True):  # run in thread
            thread = threading.Thread(target=func, args=args, kwargs=kwargs, daemon=True)
            thread.start()
            return thread
        else:
            return func(*args, **kwargs)

    return wrapper

这个装饰器函数内部定义了一个 wrapper 函数,它会根据传入的关键字参数 threaded 的值(默认值为 True)来决定是否要以多线程的方式运行被装饰的函数。

  • 如果 threaded 参数为 True(默认情况),那么它会创建一个新的线程,将被装饰的函数 func 作为这个线程要执行的目标函数,同时传递相应的参数 argskwargs,并且将线程设置为守护线程(daemon=True),意味着当主线程结束时,守护线程也会随之结束。然后启动这个线程,并返回这个线程对象。
  • 相反,如果 threaded 参数被显式地设置为 False,那么就直接调用原本的函数 func,并返回函数执行的结果。
三、定义测试函数 my_function 并使用装饰器

下面我们定义了一个简单的函数 my_function,并使用刚刚定义的 threaded 装饰器来装饰它,使其具备可以多线程运行的能力。

@threaded
def my_function(x):
    print(f"Function started with {x}")
    return x * 2

这里的 my_function 函数接收一个参数 x,在函数内部会先打印出传入的参数值,然后返回这个参数值的两倍。通过 @threaded 装饰器修饰后,调用这个函数时就可以根据需要选择是否以多线程的方式来执行它了。

四、调用测试与结果处理

最后就是对装饰后的函数进行调用以及结果的处理部分了。

result = my_function(5)
if isinstance(result, threading.Thread):
    result.join()  # 等待线程结束
else:
    print(f"Result: {result}")

我们调用 my_function(5),此时会根据装饰器中设置的逻辑来决定执行方式。如果返回的结果是一个线程对象(意味着是以多线程方式运行的),我们就调用 join 方法来等待这个线程执行结束,避免主线程过早退出而导致子线程没有执行完任务。如果返回的不是线程对象,那说明函数是直接执行并返回了结果,我们就直接打印这个结果。

通过这样一个简单的示例,我们可以看到利用装饰器能够很方便地给普通函数添加多线程执行的功能,让我们在合适的场景下能够灵活地运用多线程来提升程序性能。希望这个示例对大家学习 Python 多线程以及装饰器的使用有所帮助呀!

欢迎一起探讨更多关于 Python 编程的有趣话题哦。


http://www.kler.cn/a/468107.html

相关文章:

  • 【LC】2469. 温度转换
  • MarkDown 的 mermaid gantt(甘特图)、mermaid sequenceDiagram (流程图) 语法解析和应用
  • Sql中WITH的作用
  • CoppeliaSim和Python进行无人机联合仿真
  • 在Linux中,如何查看和修改网络接口配置?
  • 鸿蒙应用开发(2)
  • 利用Deeplearning4j进行 图像识别
  • Quartus与Synopsys联合调试
  • Golang中的通道和缓冲区
  • 计算机网络相关术语
  • 2025加密风云:行业变革与未来趋势全景透视
  • 2025/1/4期末复习 密码学 按老师指点大纲复习
  • 【51项目】51单片机自制小霸王游戏机
  • 【SpringBoot3】Spring Boot 3.0 集成 Mybatis Plus
  • 医学图像分析工具02:3D Slicer || 医学影像可视化与分析工具 支持第三方插件
  • AI辅助的运维流程自动化:实现智能化管理的新篇章
  • connect to host github.com port 22: Connection timed out 的解决方法
  • R语言的数据结构
  • 城市供水管网多普勒超声波流量计,保障供水安全
  • 【游戏设计原理】46 - 魔杖
  • 一种新的混合大模型架构:TITAN
  • 【Python运维】使用Python与Docker进行高效的容器化应用管理
  • Tomcat性能优化与负载均衡实现
  • 为什么 SPA 应用会提供一个 hash 路由,好处是什么
  • sqlserver sql转HTMM邮件发送
  • 【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算