Python线程讲解

Python多线程技巧心得详解 多线程是一种能够并发执行代码的方法,可以提高程序的执行效率和响应速度。本文将详细介绍 Python 中多线程的概念、使用场景、基本用法以及实际应用,可以更好地掌握多线程编程。 阅读详情

1.多线程threading

python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用

2.进程和线程的关系

线程是进程里面一种真正执行代码的东西,类似进程里面的箭头
进程是资源分配的单位,线程是cpu调度的单位
进程,能够完成多任务,比如 在一台电脑上能够同时运行多个QQ
线程,能够完成多任务,比如 一个QQ中的多个聊天窗口

定义的不同:

  • 进程是系统进行资源分配和调度的一个独立单位.
  • 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位
  • 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈), 但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源

区别:

  • 一个程序至少有一个进程,一个进程至少有一个线程
    -线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高
    -进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
    -线程不能够独立执行,必须依存在进程中

优缺点:

  • 线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反

3.多线程执行

import threading
import time
 
def saySorry():
 
    print("Python才是最好的语言")
 
    time.sleep(1)
 
if __name__ == "__main__":
 
    for i in range(5):
 
    t = threading.Thread(target=saySorry)
 
    t.start() # 启动线程,即让线程开始执行
 
说明:
# 可以明显看出使用了多线程并发的操作,花费时间要短很多
# 创建好的线程,需要调用start()方法来启动
# 主线程会等待所有的子线程结束后才结束

4.线程执行代码的封装

通过使用threading模块能完成多任务的程序开发,为了让每个线程的封装性更完美,所以使用threading模块时,往往会定义一个新的子类class,只要继承threading.Thread就可以了,然后重写 run方法

python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。而创建自己的线程实例后,通过Thread类的start方法,可以启动该线程,交给python 虚拟机进行调度,当该线程获得执行的机会时,就会调用run方法执行线程

多线程程序的执行顺序与多进程类似,都是不确定的

5.总结

每个线程一定会有一个名字,尽管上面的例子中没有指定线程对象的name,但是python会自动为线程指定一个名字。
当线程的run()方法结束时该线程完成。
无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式

6.多线程-共享全局变量

在一个进程内的所有线程共享全局变量,能够在不适用其他方式的前提下完成多线程之间的数据共享(这点要比多进程要好)

缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全),在线程中,不能同时对全局变量进行修改,解决办法是轮流让线程进行修改

7.同步

多线程开发可能遇到的问题

假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改10次, num的最终的结果应该为20。但是由于是多线程访问,答案可能不一样,所以在修改时, 就要让其修改完再轮到下一个线程来修改

什么是同步:

同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说,"同"字从字面上 容易理解为一起动作其实不是,"同"字应是指协同、协助、互相配合

解决问题的思路:
系统调用t1,然后获取到num的值为0,此时上一把锁,即不允许其他现在操作num

对num的值进行+1解锁,此时num的值为1,其他的线程就可以使用num了,而且是 num的值不是0而是1

同理其他线程在对num进行修改时,都要先上锁,处理完后再解锁,在上锁的整个过程 中不允许其他线程访问,就保证了数据的正确性

8.互斥锁

当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制

某个线程要更改共享数据时,先将其锁定,此时资源的状态为锁定,其他线程不能更改;直到该线程释放资源,将资源的状态变成非锁定,其他的线程才能再次锁定该资源。互斥锁保证了每次 只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性

threading模块中定义了Lock类,可以方便的处理锁定:

# 创建锁
mutex = threading.Lock()
#Python小白学习交流群:711312441 
# 锁定
mutex.acquire([blocking])
  
# 释放
mutex.release()

如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True)如果设定blocking为False,则当前线程不会堵塞

上锁解锁过程:

  • 每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为 “blocked” 状态,称为“阻塞”,直到拥有锁的线程调用锁的release()方法释放锁之后,锁进 入 “unlocked”状态。
  • 线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行( running)状态。

总结:

  • 锁的好处:
    确保了某段关键代码只能由一个线程从头到尾完整地执行
  • 锁的坏处:
    阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了
    由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时, 可能会造成死锁

9.多线程-非共享数据

对于全局变量,在多线程中要格外小心,否则容易造成数据错乱的情况发生
在多线程开发中,全局变量是多个线程都共享的数据,而局部变量等是各自线程的,是非共享的

10.死锁

举个例子:就好比是现实社会中,男女双方都在等待对方先道歉

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁

避免死锁:

# 程序设计时要尽量避免(银行家算法)<br># 添加超时时间等<br>if mutex.acquire(2):

11.同步应用

可以使用互斥锁完成多个任务,有序的进程工作,这就是线程的同步

12.生产者与消费者模式

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列 Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue

这些队列都实现了锁原语(可以理解为原子操作,即要么不做,要么就做完),能够在多线程中直接使用

可以使用队列来实现线程间的同步

Queue的说明:

  • 对于Queue,在多线程通信之间扮演重要的角色
  • 添加数据到队列中,使用put()方法
  • 从队列中取数据,使用get()方法
  • 判断队列中是否还有数据,使用qsize()方法
  • 队列就是用来给生产者和消费者解耦的

13.ThreadLocal

在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁一个thread.local()变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。thread.local()解决了参数在一个线程中各个函数之间互相传递的问题

14.异步

  • 同步调用就是你喊你朋友吃饭,你朋友在忙,你就一直在那等,等你朋友忙完了,你们一起去
  • 异步调用就是你喊你朋友吃饭,你朋友说知道了,待会忙完去找你 ,你就去做别的了
pool.apply_async(func=test,callback=test2) # callback是回调
python多线程:Thread类的用法 自定义一个Thread的子类,然后复写它的run()方法13.GIL全局解释器锁(global interpreter lock),每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行。Python的标准实现是CPython。CPython执行Python代码分为2个步骤:首先,将文本源码解释编译为字节码,然后再用一个解释器去 解释运行字节码。 阅读详情

相关推荐

Python多线程:超详细实例讲解线程的创建

在当今这个追求高效和速度的时代,程序的执行效率显得尤为重要。Python作为一门广泛应用的高级编程语言,为我们提供了多线程编程的能力,让程序能够同时执行多个任务,从而大大提高了执行效率。本文将深入探讨Python中线程创建的相关知识,通过详细的实例为你展示不同的线程创建方式及其应用场景。

yue_yun_的博客 941

python多线程详解(超详细)

一、多线程介绍 1、什么是线程? 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行 2、为什么要使用多线程? 线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。 因为线程的划分尺度小

耐心的小黑的博客 1万+

python多线程教程:python线程及多线程实例讲解

进程和线程 一、进程 进程是程序的分配资源的最小单元;一个程序可以有多个进程,但只有一个主进程;进程由程序、数据集、控制器三部分组成。 二、线程 线程是程序最小的执行单元;一个进程可以有多个线程,但是只有一个主线程;线程切换分为两种:一种是I/O切换,一种是时间切换(I/O切换:一旦运行I/O任务时便进行线程切换,CPU开始执行其他线程;时间切换:一旦到了一定时间,线程也进行切换,CPU开始执行其...

python多线程基础教程进阶教程 4386

Python 线程

文章目录线程介绍代码实现线程threading 模块threading.Thread1. 创建线程2. 线程实现TCP服务端的并发3. 线程 join 方法4. 线程之间共享5. 线程对象属性和方法守护线程GIL全局解释器锁 线程介绍 1. 在前面了解了进程的概念,简单来说进程就是在内存中申请了一块内存空间,其实还有一个线程的概念, 线程包含在进程之中,是代码真正的执行者。也就是说进程其实是一个资源单位,而线程是执行单位。 2. 线程是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程

XWenXiang的博客 4523

CS5523实战:如何用国产芯片完美替代LT8911设计MIPI转eDP电路(附原理图)

本文详细介绍了使用国产芯片CS5523完美替代LT8911进行MIPI转eDP电路设计的实战经验。文章从芯片选型、核心特性对比入手,深入剖析了电源时钟设计、MIPI/eDP接口的PCB布局与信号完整性要点,并提供了完整的原理图参考和调试排错指南,为硬件工程师实现国产化替代提供了清晰可行的方案。

yhn4567890的博客 1138

Shopee前端反爬三要素:x-sap-Ri、x-sap-Sec与af-ac-enc-dat深度解析

电商前端反爬机制本质是运行时环境可信验证,其核心在于动态生成的请求指纹、会话签名与行为加密载荷。这类机制不依赖静态Token,而是基于浏览器真实交互(如鼠标轨迹、页面可见性、时间精度)实时计算,体现JS运行时环境不可模拟性。技术价值在于将风控前移至客户端,大幅提升自动化绕过成本;典型应用场景包括商品价格监控、竞品数据采集与合规爬虫开发。本文聚焦Shopee实战案例,深入拆解x-sap-Ri(设备+行为哈希指纹)、x-sap-Sec(动态密钥签名)及af-ac-enc-dat(AES加密行为载荷)三大字段的生

weixin_29015127的博客 401

Python中的线程

Python中的线程 1.线程创建及参数传参 2.多线程的操作 3.互斥锁和死锁 多任务场景介绍 生活中的多任务场景介绍 1. 提问 利用现学知识能够让两个函数或者方法同时执行吗? 不能,因为之前所写的程序都是单任务的,也就是说一个函数或者方法执行完成另外一个函数或者方法才能执行,要想实现这种操作就需要使用多任务。 多任务的最大好处是充分利用CPU资源,提高程序的执行效率。 2. 多任务的概念 多任务是指在同一时间内执行多个任务,例如: 现在电脑安装的操作系统都是多任务操作系统,可以同时运行着多个软件。

LAM1006_csdn的博客 1万+

GLDAS数据高效处理指南:基于Matlab的NC4转GeoTIFF实战解析

本文提供了一份基于Matlab的GLDAS数据处理实战指南,详细解析了如何将NetCDF4格式的GLDAS数据高效、准确地批量转换为GIS友好的GeoTIFF格式。文章核心内容包括数据理解、环境搭建、核心代码逐步拆解、效率提升技巧以及常见避坑方案,旨在帮助全球生态、水文与气候领域的研究者打通数据预处理的关键环节,提升科研工作效率。

weixin_29094775的博客 310

python线程相关讲解

线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位。

HGX-DJK 604

Win10/Win11系统下,用VSCode编译Betaflight固件最全避坑指南(从GCC安装到HEX生成)

本文详细介绍了在Win10/Win11系统下使用VSCode编译Betaflight固件的完整流程,包括GCC安装、环境变量配置、终端选择、Make工具安装等关键步骤,帮助开发者避开常见陷阱,高效生成HEX文件。特别针对VSCode环境优化和编译错误排查提供了实用解决方案。

weixin_42557803的博客 415

CentOS7下Node.js v20+安装与常见依赖库问题解决指南

本文详细介绍了在CentOS7系统下安装Node.js v20+的完整流程及常见依赖库问题的解决方案。通过升级glibc到2.28+、配置环境变量以及处理libstdc++版本问题,帮助开发者顺利在老旧系统上部署最新版Node.js,提升开发效率。

weixin_30689307的博客 156

python多线程详细讲解

python多线程详细讲解

qq_37292005的博客 1630

从零到一:QT for OpenHarmony 开发环境实战搭建与踩坑指南

本文是一份详尽的QT for OpenHarmony开发环境搭建实战指南。文章手把手教你如何在Windows和macOS系统上,从环境准备、核心工具(DevEco Studio与社区版QT SDK)安装配置,到创建首个QT Quick项目、解决构建部署中的常见问题,最终实现应用在OpenHarmony设备上运行。内容涵盖关键配置修改、资源管理及深度踩坑经验,旨在帮助开发者高效开启跨平台开发之旅。

weixin_29190573的博客 325

实例讲解Python多线程的使用

我们知道进程是资源分配的单位,线程是处理机调度的单位。下文就以简明的例子带大家理解线程,并使用Python实现多线程。比如在飞车程序中,我们在玩游戏的同时,还可以听到游戏为我们配置的背景音乐。在最早的计算机中,操作系统处理问题是单任务的,要玩游戏和听音乐,就一定要顺序进行,不能并发。我们假设玩游戏需要3秒,听音乐需要1秒。我先听了一首《稻香》,通过for循环控制音乐播放两次,每首音乐播放需要1秒,sleep()来控制音乐播放的时长,接着又玩了两把飞车,最后关闭了程序。

xx16755498986的博客 1002

YOLOv12改进策略【Neck】| 使用CARAFE轻量级通用上采样算子

CARAFE内容感知的特征重新组合。

Limiiiing的博客 664

RH850从0搭建Autosar开发环境【2】- Davinci Configurator配置工程导入DBC与CDD文件

Davinci Configurator配置工程导入DBC与CDD文件,开始Autosar开发

weixin_42412049的博客 8146

python多线程讲解

多线程 信号量 线程锁 守护线程

travel_with_zh的博客 694

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python3 线程池源码解析_实例代码讲解Python 线程池

大家都知道当任务过多,任务量过大时如果想提高效率的一个最简单的方法就是用多线程去处理,比如爬取上万个网页中的特定数据,以及将爬取数据和清洗数据的工作交给不同的线程去处理,也就是生产者消费者模式,都是典型的多线程使用场景。那是不是意味着线程数量越多,程序的执行效率就越快呢。显然不是。线程也是一个对象,是需要占用资源的,线程数量过多的话肯定会消耗过多的资源,同时线程间的上下文切换也是一笔不小的开销,所...

weixin_39900437的博客 155

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python中的多线程详解_Python3 多线程讲解

前言Python3 线程中常用的两个模块为•_thread•threading(推荐使用)thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用”thread” 模块。为了兼容性,Python3 将 thread 重命名为 “_thread”。_threadPython中使用线程有两种方式:函数或者用类来包装线程对象。函数式:调用 _thre...

weixin_39566882的博客 103

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python多线程讲解

线程 线程(Thread),有时也被称为轻量级进程(Lightweight Process,LWP),是操作系统独⽴调度和分派的基本单位,本质上就是一串指令的集合。 ⼀个标准的线程由线程id、当前指令指针(PC),寄存器集合和堆栈组成,它是进程中的⼀个实体,线程本身不拥有系统资源,只拥有⼀点⼉在运⾏中必不可少的资源(如程序计数器、寄存器、栈),但它可与同属⼀个进程的其它线程共享进程所拥有的全部资源。线程不能够独⽴执⾏,必须依存在进程中。 多线程 多线程就是使用多个线程同时执行任务,实现了任务的并行执行

weixin_50097774的博客 1092

【Python】超详细实例讲解python多线程(threading模块)

Python 多线程编程核心要点(2026版): 基础特性: threading模块实现并发,适合I/O密集型任务 受GIL限制,CPU密集型任务建议用multiprocessing Python 3.13+提供可选无GIL模式 关键组件: Thread类创建线程 Lock/RLock处理数据竞争 Queue实现线程安全数据共享 Condition/Semaphore/Event实现线程通信 典型模式: 生产者-消费者模型(Queue+Condition) 资源池限流(Semaphore) 线程安全计数器(

m0_57545130的博客 818

【Python】超详细实例讲解Python多线程(threading模块)

threading模块提供了一个更高级的接口来管理线程。它允许创建和管理多个线程,使得程序可以在同一时间执行多个任务。本文通过多个实例详细讲解了如何使用Python的threading模块进行多线程编程,包括线程的创建、启动、同步和通信等方面。多线程编程可以提高程序的并发性,尤其是在处理IO密集型任务时非常有效。希望这些实例能帮助你更好地理解和使用Python的多线程功能!

小蜗牛的珍贵百宝箱 1801

python线程进程的用法实例+讲解

线程共享数据 → 必须加锁进程独立数据 → 通信要用 Queue进程池通信 → 必须用 Manager ().QueueIO 密集 → 线程池CPU 密集 → 进程池Windows 多进程 → 必须加 if *name*== “*main*"""@Desc:"""# ===================== 0. 导入模块 =====================import os。

2302_80130040的博客 280

Python多线程、多进程和协程的实例讲解

线程、进程和协程是什么 线程、进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实际使用这三种东西 参考: 进程、线程、协程之概念理解 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单...

ZhangQiye1993的博客 2341
上一篇: Python进程讲解
下一篇: Python常用的内置函数
Python程序u猿
博客等级 码龄5年 622粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值