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

Python笔记之线程库threading

Python笔记之线程库threading

在这里插入图片描述

参考博文
Python多线程笔记——简单函数版和类实现版

code review!

Python 的 threading 库用于在程序中创建和管理线程。线程允许程序并发执行多个任务。以下是 threading 库的详解和一些简洁示例。

基本概念

  • 线程:在一个进程中,一个线程是执行指令的单独路径。
  • 主线程:每个程序启动时都会有一个默认的主线程。
  • GIL(全局解释器锁):Python 的线程受到 GIL 的限制,不能真正并行地运行 CPU 绑定的任务,但在 I/O 密集型任务中仍然可以提高性能。

重要类和方法

  • Thread 类:用于创建线程。
    • start(): 开始线程活动。
    • join(): 阻塞调用线程,直到被调用的线程终止。
    • run(): 线程活动的方法。
  • Lock 类:用于线程间同步,防止竞争条件。
  • RLock 类:可重入锁,允许在同一线程中多次获得锁。
  • Condition 类:用于线程间通信。
  • Semaphore 类:控制对共享资源的访问。
  • Event 类:用于线程间信号通信。

简单示例

1. 创建并启动线程
import threading

def print_numbers():
    for i in range(5):
        print(i)

# 创建线程
thread = threading.Thread(target=print_numbers)

# 启动线程
thread.start()

# 等待线程完成
thread.join()

print("Thread has finished execution.")
2. 使用锁同步线程
import threading

counter = 0
lock = threading.Lock()

def increment_counter():
    global counter
    with lock:
        for _ in range(10000):
            counter += 1

threads = [threading.Thread(target=increment_counter) for _ in range(2)]

for thread in threads:
    thread.start()

for thread in threads:
    thread.join()

print(f"Final counter value: {counter}")
3. 创建自定义线程类
import threading

class MyThread(threading.Thread):
    def run(self):
        for i in range(5):
            print(f"Thread {self.name}: {i}")

# 实例化并启动自定义线程
thread = MyThread()
thread.start()
thread.join()

注意事项

  • 线程安全:在访问共享数据时使用锁确保线程安全。
  • 性能:对于 CPU 密集型任务,考虑使用 multiprocessing 模块。
  • 调试:调试多线程程序可能会比较困难,可以使用日志记录来帮助调试。

这些示例展示了如何使用 threading 库创建和管理线程,以及如何解决常见的同步问题。


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

相关文章:

  • el-checkbox勾选一个变成了勾选所有
  • 微信小程序-事件总线
  • Ubuntu 搭建Yapi服务
  • jenkins 构建报错 Cannot run program “sh”
  • spring ai 入门 之 结构化输出 - 把大模型llm返回的内容转换成java bean
  • Redis(2):内存模型
  • 【WebApi】C# webapi 后端接收部分属性
  • 如何安装QT(linux/windows)
  • 【矩阵的大小和方向的分解】
  • 20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N
  • LED点阵显示(Proteus 与Keil uVision联合仿真)(点阵字模提取)
  • 伍光和《自然地理学》电子书(含考研真题、课后习题、章节题库、模拟试题)
  • 在一个项目中同时应用OpenAPI、JSON Schema和OAuth2三个规范
  • 如何获取 Django 模型中所有带有选择的字段?
  • 自己生成的页面,保存为图片,并下载word
  • Java+Swing学生信息管理系统
  • JZ8二叉树的下一个结点
  • P10 Pytorch入门实战——Pytorch实现车牌识别
  • WPF 特性------Binding
  • PySpark任务提交
  • Pr 沉浸式视频 - 自动 VR 属性
  • 查找重复的电子邮箱
  • Java 实现接口幂等的九种方法:确保系统稳定性与数据一致性
  • C语言字符数组 java封装
  • sql中判断一个字段是否包含一个数据的方法有哪些?
  • Spring Boot框架在教育领域的创新应用:导师双选系统