如何在类内部封装并启动多个线程实例

老晨同学_8960

老晨同学_8960

2026-01-20

925人浏览

原创

如何在类内部封装并启动多个线程实例

本文介绍如何将多线程逻辑完全封装在 python 类中,使每个对象实例自主管理其内部的两个并发线程,避免在主程序中手动创建和调度线程,提升代码复用性与可维护性。

在面向对象设计中,理想的多线程封装应遵循“职责内聚”原则:对象自身负责其并发行为的生命周期(启动、等待、清理),而非由外部协调。上述需求可通过在类中定义 run_threads() 和 join_threads() 方法实现——前者启动两个独立线程分别执行 func_one 和 func_two,后者阻塞主线程直至本实例所有子线程完成。

以下是完整、可运行的封装示例(含模拟任务与日志输出,便于验证并发行为):

import threading
import time

class MyObject:
    def __init__(self, item_id):
        self.item_id = item_id
        # 可选:为线程安全预留属性(如 event、lock 等)
        self._threads = []

    def func_one(self):
        print(f"[{self.item_id}] func_one started")
        time.sleep(1.5)  # 模拟耗时操作
        print(f"[{self.item_id}] func_one completed")

    def func_two(self):
        print(f"[{self.item_id}] func_two started")
        time.sleep(1.0)
        print(f"[{self.item_id}] func_two completed")

    def run_threads(self):
        """启动本实例的两个工作线程"""
        thread1 = threading.Thread(target=self.func_one, name=f"{self.item_id}-func1")
        thread2 = threading.Thread(target=self.func_two, name=f"{self.item_id}-func2")

        # 存储引用以供后续 join(也可直接用实例属性,但列表更易扩展)
        self._threads = [thread1, thread2]

        thread1.start()
        thread2.start()

    def join_threads(self):
        """等待本实例所有工作线程结束"""
        for t in self._threads:
            t.join()

# 使用示例:创建多个独立实例,并发运行
if __name__ == "__main__":
    obj1 = MyObject("item-01")
    obj2 = MyObject("item-02")

    # 启动所有实例的线程(非阻塞)
    obj1.run_threads()
    obj2.run_threads()

    # 主线程等待全部完成(顺序无关,自动同步)
    obj1.join_threads()
    obj2.join_threads()

    print("All instances finished.")

✅ 关键优势:

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • ✅ 高内聚:线程创建、启动、等待均在类内部完成;
  • ✅ 实例隔离:每个 MyObject 实例拥有独立线程上下文,互不干扰;
  • ✅ 可扩展性强:若需增加第三线程或动态控制,只需修改 run_threads() 内部逻辑;
  • ✅ 资源可控:通过 _threads 列表统一管理,便于调试、监控或中断(如添加 is_alive() 检查)。

⚠️ 注意事项:

  • 避免在 __init__ 中直接启动线程(易导致未完成初始化即执行);
  • 若线程需访问共享状态,请显式使用 threading.Lock 或 threading.Event 保证安全;
  • join() 必须在 start() 之后调用,否则会引发 RuntimeError;
  • 生产环境建议为线程命名(name= 参数),便于日志追踪与调试。

通过这种封装方式,你不仅能写出更清晰、更易测试的并发代码,也为后续集成线程池、异步任务队列等高级模式打下坚实基础。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.05

6995

14

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

362

13

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

2026.04.09

364

30

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

2026.04.17

243

15

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

4458

6

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

2025.12.24

1249

20

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.21

423

30

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

2026.01.21

579

24

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

429

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习