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

python测试开发基础---threading

1. 核心概念

线程(Thread):线程是轻量级的进程,在同一进程内可以并行执行多个任务。线程共享进程的资源,如内存和文件描述符,但每个线程有自己的执行栈和局部变量。

全局解释器锁(GIL):Python中的GIL限制了同一进程中多个线程的真正并行执行。它确保同一时间只有一个线程可以执行Python字节码,这对计算密集型任务可能会影响性能,但对于I/O密集型任务效果仍然良好。

2. threading模块的主要类和方法

2.1 Thread
  • 功能:用来创建和管理线程。
  • 常用方法
    • __init__(self, group=None, target=None, name=None, args=(), kwargs={}):构造函数,创建线程对象。
    • start(self):启动线程,调用run()方法。
    • run(self):线程执行的代码逻辑,子类需要重写此方法。
    • join(self, timeout=None):等待线程完成。
    • is_alive(self):检查线程是否仍在运行。

基本用法示例

import threadingdef print_numbers():for i in range(5):print(i)# 创建线程对象
thread = threading.Thread(target=print_numbers)# 启动线程
thread.start()# 等待线程完成
thread.join()
2.2 Lock
  • 功能:用于线程间的同步,防止数据竞争。
  • 常用方法
    • acquire(blocking=True, timeout=-1):获取锁,blocking指定是否阻塞,timeout指定最大等待时间。
    • release():释放锁。

使用锁的示例

import threadinglock = threading.Lock()def thread_task():with lock:  # 自动获取和释放锁print("Thread is running")threads = [threading.Thread(target=thread_task) for _ in range(5)]for thread in threads:thread.start()for thread in threads:thread.join()
2.3 RLock
  • 功能:可重入锁,允许同一个线程多次获取锁。
  • 常用方法:与Lock类相同,但支持重入。

使用RLock的示例

import threadingrlock = threading.RLock()def thread_task():with rlock:# 允许多次获取with rlock:print("Thread is running")thread = threading.Thread(target=thread_task)
thread.start()
thread.join()
2.4 Event
  • 功能:用于线程间的简单通信,允许线程等待特定事件发生。
  • 常用方法
    • set():标记事件为“已发生”。
    • clear():标记事件为“未发生”。
    • wait(timeout=None):等待事件发生,阻塞直到事件标记为“已发生”或超时。

使用Event的示例

import threading
import timeevent = threading.Event()def worker():print("Worker is waiting for event")event.wait()  # 等待事件被标记为“已发生”print("Worker has detected event")thread = threading.Thread(target=worker)
thread.start()time.sleep(2)
event.set()  # 触发事件
2.5 Condition
  • 功能:提供线程间的复杂同步机制,允许线程在满足特定条件时继续执行。
  • 常用方法
    • acquire():获取锁。
    • release():释放锁。
    • wait(timeout=None):等待条件满足。
    • notify(n=1):通知一个或多个等待的线程。
    • notify_all():通知所有等待的线程。

使用Condition的示例

import threadingcondition = threading.Condition()def consumer():with condition:print("Consumer is waiting")condition.wait()  # 等待通知print("Consumer received notification")def producer():with condition:print("Producer is notifying")condition.notify()  # 发送通知consumer_thread = threading.Thread(target=consumer)
producer_thread = threading.Thread(target=producer)consumer_thread.start()
producer_thread.start()consumer_thread.join()
producer_thread.join()

3. 线程同步和通信

  • 同步:通过LockRLockCondition等类来避免线程间的数据竞争。
  • 通信:使用EventQueue等类来实现线程间的消息传递。

4. 实际应用

  • I/O密集型任务:例如处理多个网络请求、文件操作等。
  • 计算密集型任务:虽然GIL可能会影响效率,但对于混合任务或需要同时处理I/O的计算任务,threading仍然有用。

5. 注意事项

  • 线程安全:在多线程环境下访问共享资源时,需要小心数据竞争和线程安全问题。
  • 死锁:确保所有锁的获取和释放顺序一致,以避免死锁情况。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++】网络编程之Socket初体验-超详细!
  • ALSC、IPLC、IEPL差异解说
  • ffmpeg视频转切片m3u8并加密videojs播放hls.js播放dplayer播放(弹幕效果)
  • FxFactory 8 for Mac 视觉特效插件包安装
  • CSS解析:层叠、优先级和继承
  • 【LeetCode】01.两数之和
  • 【内网渗透】内网信息收集的十三种基本方式
  • nvidia-cuda-tensorrt-cudnn下载网站
  • LLM 模型压缩之三: FoldGPT
  • 高级算法设计与分析 学习笔记3 哈希表
  • maven-helper插件解决jar包冲突实战
  • 使用udp进行通信
  • 宏碁扩展Swift系列,推出四款全新AI笔记本电脑
  • 番外 1 : 安装 docker 和 docker-compose
  • Oracl查询报错:ORA-29275: 部分多字节字符
  • 《深入 React 技术栈》
  • 「面试题」如何实现一个圣杯布局?
  • Angular 响应式表单 基础例子
  • CentOS7 安装JDK
  • Java程序员幽默爆笑锦集
  • Java读取Properties文件的六种方法
  • laravel 用artisan创建自己的模板
  • laravel5.5 视图共享数据
  • storm drpc实例
  • 基于webpack 的 vue 多页架构
  • 讲清楚之javascript作用域
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端设计模式
  • 智能合约开发环境搭建及Hello World合约
  • 字符串匹配基础上
  • Python 之网络式编程
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #include<初见C语言之指针(5)>
  • (1)Nginx简介和安装教程
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (论文阅读40-45)图像描述1
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)ObjectiveC 深浅拷贝学习
  • (转)Windows2003安全设置/维护
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET构架之我见
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • /etc/skel 目录作用
  • @Documented注解的作用
  • @EnableConfigurationProperties注解使用
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149