首页 > 编程语言 >python测试开发基础---threading

python测试开发基础---threading

时间:2024-09-06 17:52:23浏览次数:13  
标签:Thread thread start python --- threading 线程 print

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 threading

def 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 threading

lock = 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 threading

rlock = 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 time

event = 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 threading

condition = 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. 注意事项

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

标签:Thread,thread,start,python,---,threading,线程,print
From: https://blog.csdn.net/weixin_54641346/article/details/141960325

相关文章

  • python测试开发基础---multiprocessing.Pool
    1.基础概念多进程编程:Python中的multiprocessing模块允许你使用多个进程并行执行任务,这可以提高程序的性能,尤其是在需要大量计算的情况下。Pool类是一个常用工具,可以帮助你更轻松地管理多个进程。进程池:进程池是一个包含多个工作进程的池子,用来处理多个任务。你可以将任......
  • js逆向--cai招网
    js逆向--cai招网一、寻找加密入口1、抓包2、关键字搜索寻找加密入口二、调试js三、python代码实现一、寻找加密入口1、抓包目标数据来源网址为:https://search.bidcenter.com.cn/search?keywords=%E5%85%AC%E5%85%B1%E4%BD%8F%E5%AE%85,打开开发者工具进行......
  • 最好用的Python IDE,PyCharm保姆级安装教程
    简介由于Python语法简单容易入门,并且Python在办公自动化等领域的功能非常强大,所以现在越来越多非IT行业的人也开始学起了Python,要学习和使用一门编程语言,一个好用的IDE是必不可少的,而对于Python来说,最好的IDE无疑是Pycharm。本文就给大家介绍一下如何从零到一来安装Pychar......
  • L2-049 鱼与熊掌 分数 25
    使用set_intersection()判断两个集合之间重复元素,时间复杂度最坏O(nlogn),最好O(n)#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,m;cin>>n>>m;vector<set<int>>res(m+1);for(inti=1;i<=n;++i){......
  • Python贝叶斯卷积神经网络BCNN分类胸部X光图像数据集实例
    全文链接:https://tecdat.cn/?p=37604原文出处:拓端数据部落公众号分析师:YuanchunNiu在人工智能的诸多领域中,分类技术扮演着核心角色,其应用广泛而深远。无论是在金融风险评估、医疗诊断、安全监控还是日常的交互式服务中,有效的分类算法都是实现智能决策的关键。随着大数据时代的......
  • puthon-txt(1) 从txt读取gnss数据
     数据1453132356.60000034.0342694493108.755911045587.8002931453132357.96000034.0344383177108.755909682587.6737781453132358.52000034.0345050891108.755905295587.5684091453132359.16000034.0345823584108.755898876587.5876111453132359.56000034.......
  • 【Python学习笔记】第3章 你应如何运行程序
    这一章主要讲:如何启动Python程序、如何交互地输入代码、代码的各种运行方式。交互式命令行模式开始一个交互式会话在终端中,输入python:我们就开启了会话。结束会话按Ctrl+Z:系统路径如果我们要在终端中,输入python就可以启动,那么就需要设置环境变量PATH使其包含安装的python......
  • 信息学奥赛初赛天天练-84-NOIP2014普及组-基础题3-总线、存储器、邮件协议、二叉树、
    信息学奥赛初赛天天练-84-NOIP2014普及组-基础题3-总线、存储器、邮件协议、二叉树、满二叉树、顶点的度、无向图、有向图PDF文档公众号回复关键字:202409061NOIP2014普及组基础题36CPU、存储器、I/O设备是通过()连接起来的A接口B总线C控制线D系统文......
  • 『模拟赛』CSP-S模拟1
    Rank1BADA.喜剧的迷人之处在于签。正好早上还在改一个要分解质因数的题,所以一眼就出思路了。首先将\(a\)的平方因子全部除去,剩下的就是\(b\)必须的因数,即若设将平方因子全部除去后的\(a\)为\(a'\),则\(b\)应表示为\(a'\timesx^2\),从\(L\)这个下界开始只用找......
  • 高速背板连接器 249-4214-11V、249-4216-11V、249-4218-11V、249-4219-11V、249-421H-
    系列概述Paladin®HD系列延续了其作为行业领先的高速应用互连解决方案的传统。Paladin®HD2利用与PaladinHD相同的板连接、双轴电缆连接和配对接口实现向后兼容性,提供直接升级到224Gb/sPAM4的途径。分立屏蔽差分对和革命性的电路板技术实现了无与伦比的性能和密度。特性:世界级......