Python 多线程之 threading 模块

在Python中获取当前线程的名字 多线程编程是一种常见的编程范式,它允许程序同时执行多个任务。在Python中,​​模块提供了对多线程编程的支持。了解和管理当前运行的线程是多线程编程中的一个重要方面。本技术博客将介绍如何在Python中获取当前线程的名字,并提供一系列的示例代码,以帮助您更好地理解和利用这一功能。 阅读详情

1 创建线程

使用 threading 模块创建线程通常有两种方式:1)使用 threading 模块中 Thread 类的构造器创建线程,即直接对类 threading.Thread 进行实例化,并调用实例化对象的 start 方法创建线程;2)继承 threading 模块中的 Thread 类创建线程类,即用 threading.Thread 派生出一个新的子类,将新建类实例化,并调用其 start 方法创建线程。

1.1 构造器方式

调用 threading.Thread 类的如下构造器创建线程:

threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

  • group:指定该线程所属的线程组,目前该参数还未实现,为了日后扩展 ThreadGroup 类实现而保留。

  • target:用于 run() 方法调用的可调用对象,默认是 None,表示不需要调用任何方法。

  • args:是用于调用目标函数的参数元组,默认是 ()。

  • kwargs:是用于调用目标函数的关键字参数字典,默认是 {}。

  • daemon:如果 daemon 不是 None,线程将被显式的设置为守护模式,不管该线程是否是守护模式,如果是 None (默认值),线程将继承当前线程的守护模式属性。

示例如下:

import time
import threading
def work(num):
    print('线程名称:',threading.current_thread().getName(),'参数:',num,'开始时间:',time.strftime('%Y-%m-%d %H:%M:%S'))
if __name__ == '__main__':
    print('主线程开始时间:',time.strftime('%Y-%m-%d %H:%M:%S'))
    t1 = threading.Thread(target=work,args=(3,))
    t2 = threading.Thread(target=work,args=(2,))
    t3 = threading.Thread(target=work,args=(1,))
    t1.start()
    t2.start()
    t3.start()
    t1.join()
    t2.join()
    t3.join()
    print('主线程结束时间:', time.strftime('%Y-%m-%d %H:%M:%S'))

上述示例中实例化了三个 Thread 类的实例,并向任务函数传递不同的参数,start 方法开启线程,join 方法阻塞主线程,等待当前线程运行结束。

1.2 继承方式

通过继承的方式创建线程包括如下步骤:1)定义 Thread 类的子类,并重写该类的 run 方法;2)创建 Thread 子类的实例,即创建线程对象;3)调用线程对象的 start 方法来启动线程。示例如下:

import time
import threading
class MyThread(threading.Thread):
    def __init__(self,num):
        super().__init__()
        self.num = num
    def run(self):
        print('线程名称:', threading.current_thread().getName(), '参数:', self.num, '开始时间:', time.strftime('%Y-%m-%d %H:%M:%S'))
if __name__ == '__main__':
    print('主线程开始时间:',time.strftime('%Y-%m-%d %H:%M:%S'))
    t1 = MyThread(3)
    t2 = MyThread(2)
    t3 = MyThread(1)
    t1.start()
    t2.start()
    t3.start()
    t1.join()
    t2.join()
    t3.join()
    print('主线程结束时间:', time.strftime('%Y-%m-%d %H:%M:%S'))

上述示例中自定义了线程类 MyThread,继承了 threading.Thread,并重写了 __init__ 方法和 run 方法。

2 守护线程

守护线程(也称后台线程)是在后台运行的,它的任务是为其他线程提供服务,如 Python 解释器的垃圾回收线程就是守护线程。如果所有的前台线程都死亡了,守护线程也会自动死亡。来看个例子:

# 不设置守护线程
import threading
def work(num):
    for i in range(num):
        print(threading.current_thread().name + "  " + str(i))
t = threading.Thread(target=work, args=(10,), name='守护线程')
t.start()
for i in range(10):
    pass
    
# 输出结果:
'''
守护线程  0
守护线程  1
守护线程  2
守护线程  3
守护线程  4
守护线程  5
守护线程  6
守护线程  7
守护线程  8
守护线程  9
'''
# 设置守护线程
import threading
def work(num):
    for i in range(num):
        print(threading.current_thread().name + "  " + str(i))
t = threading.Thread(target=work, args=(10,), name='守护线程')
t.daemon = True
t.start()
for i in range(10):
    pass
    
# 输出结果:
# 守护线程  0

上述示例直观的说明了当前台线程结束,守护线程也会自动结束。

如果你设置一个线程为守护线程,就表示这个线程是不重要的,在进程退出的时候,不用等待这个线程退出;如果你的主线程在退出的时候,不用等待哪些子线程完成,那就设置这些线程为守护线程;如果你想等待子线程完成后再退出,那就什么都不用做,或者显示地将 daemon 属性设置为 false。

3 线程本地数据

Python 的 threading 模块提供了 local 方法,该方法返回得到一个全局对象,不同线程使用这个对象存储的数据,其它线程是不可见的(本质上就是不同的线程使用这个对象时为其创建一个独立的字典)。来看个示例:

# 不使用 threading.local
import threading
import time
num = 0
def work():
    global num
    for i in range(10):
        num += 1
    print(threading.current_thread().getName(), num)
    time.sleep(0.0001)
for i in range(5):
    threading.Thread(target=work).start()
# 输出结果:
'''
Thread-1 10
Thread-2 20
Thread-3 30
Thread-4 40
Thread-5 50
'''

上面示例中 num 是全局变量,变成了公共资源,通过输出结果,我们发现子线程之间的计算结果出现了互相干扰的情况。

# 使用 threading.local
num = threading.local()
def work():
    num.x = 0
    for i in range(10):
        num.x += 1
    print(threading.current_thread().getName(), num.x)
    time.sleep(0.0001)
for i in range(5):
    threading.Thread(target=work).start()
    
# 输出结果:
'''
Thread-1 10
Thread-2 10
Thread-3 10
Thread-4 10
Thread-5 10
'''

使用 threading.local 的示例中,num 是全局变量,但每个线程定义的属性 num.x 是各自线程独有的,其它线程是不可见的,因此每个线程的计算结果未出现相互干扰的情况。

4 定时器

threading 模块提供了 Timer 类实现定时器功能,来看个例子:

# 单次执行
from threading import Timer
def work():
    print("Hello Python")
# 5 秒后执行 work 方法
t = Timer(5, work)
t.start()

Timer 只能控制函数在指定的时间内执行一次,如果我们需要多次重复执行,需要再进行一次调度,想要取消调度时可以使用 Timer 的 cancel 方法。来看个例子:

# 重复执行
count = 0
def work():
    print('当前时间:', time.strftime('%Y-%m-%d %H:%M:%S'))
    global t, count
    count += 1
    # 如果 count 小于 5,开始下一次调度
    if count < 5:
        t = Timer(1, work)
        t.start()
# 指定 2 秒后执行 work 方法
t = Timer(2, work)
t.start()

5 常用方法、属性

threading 模块提供了十分丰富的线程操作功能,它的 API 方法及属性自然也特别多,我们来看一下常用的方法和属性。

1)threading.Thread 实例的方法、属性

方法说明
start()启动线程活动,它在一个线程里最多只能被调用一次。
run()表示线程活动的方法。
join(timeout=None)等待至线程中止。
getName()返回线程名。
setName()设置线程名。
is_alive()返回线程是否是活动的。
daemon是否为守护线程的标志。
ident线程标识符,线程尚未开始返回 None,已启动返回非零整数。

2)threading 直接调用的方法

方法说明
active_count()返回当前存活的线程类 Thread 对象,返回个数等于 enumerate() 返回的列表长度。
current_thread()返回当前对应调用者的 Thread 对象。
get_ident()返回当前线程的线程标识符,它是一个非零的整数。
enumerate()以列表形式返回当前所有存活的 Thread 对象。
main_thread()返回主 Thread 对象。
settrace(func)为所有 threading 模块开始的线程设置追踪函数。
setprofile(func)为所有 threading 模块开始的线程设置性能测试函数。
stack_size([size])返回创建线程时用的堆栈大小。

总结

本节给大家介绍了 Python 的线程模块 threading,让大家对 threading 模块的相关概念和使用有了进一步的了解。

参考:

https://docs.python.org/zh-cn/3/library/threading.html

threading 模块的 Thread 类的使用 通过自定义类继承 Thread 的方式实现线程时,要求自定义的类的 __init__ 方法调用父类 Thread 的 __init__ 方法,如果忘记调用 Thread 的 __init__ 方法,则会报错。# 在此处没有调用父类 threading.Thread.__init__ 方法t0.start()t1.start()t0.join()t1.join()以上错误信息显示,Thread.__init__ 没有被调用。 阅读详情

相关推荐

Python并发编程:多线程(threading模块)

多线程是一种并发编程方式,它允许在一个进程内同时运行多个线程,从而提高程序的运行效率。线程是轻量级的进程,拥有自己的栈空间,但共享同一个进程的内存空间。本文详细介绍了Python的threading模块,包括线程的创建、线程同步、线程池的使用,并通过多个示例展示了如何在实际项目中应用这些技术。通过学习这些内容,您应该能够熟练掌握Python中的多线程编程,提高编写并发程序的能力。多线程编程可以显著提高程序的并发性能,但也带来了新的挑战和问题。

互联网架构小马的博客 2031

python多线程:threading.Thread的args参数注意事项

| init(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None) | This constructor should always be called with keyword arguments. Arguments are: | | group should be None; reserved for future extension when a ThreadGroup |

lingyuncelia的博客 7016

快速傅里叶变换(FFT)原理详解:从理论到实践

本文系统介绍了快速傅里叶变换(FFT)的理论与实践。首先阐述了傅里叶变换的数学定义和离散傅里叶变换(DFT)的矩阵表示,指出其O(N²)计算复杂度限制了实际应用。然后详细解析了Cooley-Tukey算法的核心思想,包括分治策略、蝶形运算原理和旋转因子的周期性特性,将复杂度降至O(Nlog₂N)。文章比较了按时间抽取(DIT)和按频率抽取(DIF)两种FFT算法实现,并讨论了FFT在信号处理等领域的应用及其局限性。通过理论分析和实例说明,展现了FFT如何成为现代数字信号处理的基石算法。

qq_42212808的博客 2923

python——Thread类详解

threading库是python的线程模型,利用threading库我们可以轻松实现多线程任务。本文主要介绍Thread类

iamballer77的博客 6798

基于LSTM的多变量温度预测(python从入门到入坑)

基于LSTM的多变量温度预测(python) ——我保证他能够运行,而且结果能够让你满意(如果你和我一样都是一个新手的话) 这里写目录标题基于LSTM的多变量温度预测(python)——我保证他能够运行,而且结果能够让你满意(如果你和我一样都是一个新手的话)一、我为什么要写这些?二、具体做了什么?三、源代码切块加注释,恳请批评指正(●’◡’●)ノ 一、我为什么要写这些? 因为让人抓狂的课程大作业,我小组选择了一个多变量预测方面的课题,在我这个大三基本上还没接触过Python数据处理,甚至对神经网络什么的都

代码之狐的博客 1万+

ANSYS 有限元分析 接触分析

目 录一、前沿二、接触单元类三、接触单元关键选项3.1 CONTA174 KeyOption3.2 TARGE170 KeyOption四、接触分析标准步骤4.1 定义实常数4.2 定义接触和目标单元4.3 创建接触和目标单元五、接触分析实例5.1 MPC5.2 标准接触六、尾声七、参考文献 阿阳的 ANSYS 使用指南,本文仅用于个人学习,除此之外,无其他任何用途。 ANSYS 有限元分析 概述 ANSYS 有限元分析 坐标系/工作平面 ANSYS 有限元分析 几何建模 ANSY

Hulunbuir 4万+

python中的线程threading.Thread()使用

1. 线程的概念: 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 2. threading....

菜鸡小白的成长记录 6359

Android音频学习(十四)——加载音频设备

loadHwModule 是 Android 音频系统的核心初始化函数,负责加载音频硬件抽象层(HAL)的模块实现。它建立 AudioPolicyService 与底层硬件的桥梁,将配置文件(audio_policy_config.xml)中的标签<module>定义转化为可操作的硬件对象,加载的是音频硬件模块(HAL实现),每个模块对应一种音频设备类型,以动态库的形式存在,负责与底层音频硬件交互。

miemie2014的博客 1730

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

介绍Python中threading模块实现多线程,从线程的概念开始,由浅入深介绍使用Thread类创建子线程,使用join阻塞线程,重写父类创建子线程,前台线程与后台线程以及线程同步

Xiao_Liu_OvO的博客 5万+

YOLOv12改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构

本文记录的是基于。采用了创新性的方法,通过精心平衡网络和来提升性能。本文将的设计优势融入YOLOv12中,提升YOLOv12的性能与效率,使其在目标检测任务中表现更为出色。本文配置了原模型中的共种不同大小的模型结构,以满足不同的需求。

Limiiiing的博客 963

⭐️【2024年新版教程】vmware tools安装步骤(Windows、Linux、MacOS版本)

VMware Tools是VMware提供的一套实用工具,它可以增强虚拟机与宿主机之间的交互性能,如改进显示性能、优化鼠标和键盘性能、提供时间同步功能等。无论是在Windows、Linux还是MacOS虚拟机上,安装VMware Tools都可以提高虚拟机的使用体验。以上就是在不同操作系统上安装VMware Tools的步骤,希望对您有所帮助。

Python老吕的博客 6万+

Python多线程 threading模块

用threading模块,可以实现Python多线程编程。 import threading import time def video(secs): for i in range(secs): print("边看瘦身操......%d" % i) time.sleep(1) def dance(secs): for i in range(s...

Mr.李大白的专栏 446

Apollo 9.0 参考线生成器 -- ReferenceLineProvider

在基于参考线的规划算法中,参考线是Planning一切工作的基础和前提,所以搞清楚参考线怎么来的就变得很重要。为此,首先需要了解Planning 与 Routing的交互,通过交互得到路径片段,这些路径片段就告诉我们该怎么走,再在此基础上生成参考线,最后使用不同的平滑算法对参考线进行平滑,得到一条光滑的参考线。

WaiNgai 1664

【Python】多线程及threading模块介绍

python中的多线程同步问题及互斥锁使用,和可能出现的死锁情况

sinat_41752325的博客 2283

RT-DETR训练自己的数据集(从代码下载到实例测试)

在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。

Limiiiing的博客 4万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Python多线程——threading模块使用

每个独立的线程都有一个程序运行的入口、顺序执行序列和程序的出口。但是程序不能够独立执行,必须依附在应用程序中,由应用程序提供多个线程执行控制。 每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器状态。 指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。 python3线程中常用的模块:threading 一、使用threading模块创建线程 impor

WallE 6916

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python多线程(threading模块)详解

多线程是Python中提高程序性能的重要手段之一。通过threading模块,我们可以方便地创建和管理线程,实现线程同步和线程间通信。然而,多线程编程也带来了复杂的线程管理和数据同步问题,需要开发者仔细设计和测试。版权声明:本博客内容为原创,转载请保留原文链接及作者信息。参考文章Python 多线程 | 菜鸟教程【Python】超详细实例讲解python多线程(threading模块)

ning的博客 1935

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Python多线程编程——threading模块】—— Python多线程系列文章(一)

文章目录前言threading模块(一)简介(二)创建线程—start()方法(三)join()方法(四)setDaemon(bool) 前言 在日常的开发中经常会用到多线程和多进程编程,使用多线程编程可降低程序的复杂度,使程序更简洁高效。 线程是程序执行流的最小单元,是进程的一个实体,一个进程可以拥有多个线程,多个线程可以共享进程所拥有的资源。 线程可以提升程序的整体性能,一般分为内核线程和用户线程,内核线程由操作系统内核创建和撤销,用户线程不需要内核支持,是在用户程序中实现的线程。 需要注意的是:线程

youngwyj的博客 2753

【Python】threading 模块:用于实现多线程编程

Python 的 threading 模块是标准库的一部分,用于实现多线程编程,适合处理 I/O 密集型任务(如网络请求、文件读写),支持 Thread、Lock、Semaphore、Event、Queue、Timer 等。由于 Python 的全局解释器锁(GIL)限制,threading 不适合 CPU 密集型任务(这些任务应使用 multiprocessing)。threading 提供了创建和管理线程的 API,支持线程同步、通信和定时执行,接口简单且跨平台。本文将详细介绍 threading 模块

彬彬侠的博客 1603

Python-多线程编程(threading 模块)

Python使用threading模块实现多线程,允许同时执行多任务。线程是操作系统调度的最小单位,生命周期包括创建、启动、运行、阻塞和死亡。Thread类提供start()和join()方法管理线程。因GIL机制,Python多线程对CPU密集型任务效果有限,但对I/O密集型任务影响较小。线程可通过实例化Thread或重写run方法创建。所有子线程结束后,主线程会等待其完成。

kusunoki的博客 1675

Python 多线程(threading模块)

首先,自己区分单线程和多线程的概念,自己去搜 单线程的例子如下:

Calling_Wisdom 1万+

Python多线程(threading模块)

目录 一:线程的两种调用方式 1.1 直接调用  1.2 类式调用 二:Join&amp;Daemon 三:同步锁(lock) 四:线程死锁和递归锁 五:条件变量同步(Condition) 六:同步条件 七:信号量(Semaphore) 八:多线程利器(queue) 九:上下文管理器(contextlib模块) 十:自定义线程池 一:线程的两种调用方式 1.1 直接调用...

马赛克的博客 1592

python中threading产生死锁_Python的多线程模块threading

概述Python3的多线程编程中常用的两个模块为:_thread,threading。推荐使用threading模块。毕竟_thread模块是相当底层的模块,虽然该模块可以让你对线程进行细致的管理,但由于没有提供高级函数,所以用起来比较费劲。(轮子不如threading模块的好使)以下内容将基于threading模块展开。创建线程threading模块支持两种创建线程的方式,分别是函数方式创建,以...

weixin_39612849的博客 172

Python多线程threading模块(一)创建线程

文章出自Python21学习挑战赛活动,记录了python多线程模块threading的一些基础知识。

m0_52339560的博客 762

Python多线程之_thread与threading模块

在多线程的应用程序中,每一个线程的执行时间等于应用程序所花的CPU时间除以线程的数目。在Python程序中,多线程的应用程序会创建一个函数,来执行需要重复执行多次的程序代码,然后创建一个线程执行该函数。下面的示例直接从threading.Thread类继承创建一个新的子类,并实例化后调用start()方法启动新线程,即它调用了线程的run()方法。(2)_thread.exit():拋出一个SystemExit,以终止线程的执行。(3)_thread.get_ident():读取目前线程的识别码。

夏天又到了的专栏 849
上一篇: Selenium基本命令和操作
下一篇: Python multiprocessing 模块
唐僧不爱八戒
博客等级 码龄9年 158粉丝 84原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值