Python并发编程之五:threading 模块

本文详细介绍了Python threading模块的接口与功能,包括active_count(), current_thread(), get_ident()等函数,以及如何使用Thread类开启线程的不同方式。同时探讨了守护线程、互斥锁、死锁与递归锁、信号量、线程队列和线程池的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

  • multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,中文文档链接:https://docs.python.org/zh-cn/3/library/threading.html
  • 这个模块在较低级的模块 _thread 基础上建立较高级的线程接口。
  • 该模块的设计基于 Java的线程模型。 但是,在Java里面,锁和条件变量是每个对象的基础特性,而在Python里面,这些被独立成了单独的对象。 Python 的 Thread 类只是 Java 的 Thread 类的一个子集;目前还没有优先级,没有线程组,线程还不能被销毁、停止、暂停、恢复或中断。 Java 的 Thread 类的静态方法在实现时会映射为模块级函数。

二、threading 模块级别函数

函数 解释
threading.active_count() 返回当前活动的Thread对象的数量,与enumerate()函数返回的列表元素个数相同
threading.current_thread() 返回当前Thread对象,对应调用者的控制线程(thread of control)。如果调用者的控制线程不是通过threading模块创建,返回一个功能受限的哑线程对象(dummy thread object)
threading.get_ident() 返回一个非零整数,代表当前线程的"线程标识符"。这个值意在作为魔术cookie使用,例如作为索引从特定于线程的字典对象获取数据。当一个线程退出,新的线程创建,线程标识符可能被回收使用
threading.enumerate() 返回当前活动Thread对象的列表。该列表包含守护线程、current_thread()函数创建的哑线程,以及主线程,不包含已终止的线程和未启动的线程。
threading.main_thread() 返回主线程对象。通常来说,主线程就是启动python解释器的线程。
threading.settrace(func) 为启动自threading模块的所有线程设置一个trace函数。在每个线程的run()方法调用前,传递func参数给sys.settrace()
threading.setprofile(func) 为启动自threading模块的所有线程设置一个profile函数。在每个线程的run()方法调用前,传递func参数给sys.setprofile()
threading.stack_size([size]) 返回创建新线程使用的线程堆栈大小。

三、Thread 类的使用

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

调用这个构造函数时,必需带有关键字参数。参数如下:

  • group 应该为 None;为了日后扩展 ThreadGroup 类实现而保留。

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

  • name 是线程名称。默认情况下,由 “Thread-N” 格式构成一个唯一的名称,其中 N 是小的十进制数。

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

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

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

1、开启线程的方式

Thread类代表在单独的控制线程中运行的活动,有两种方式指定:传递可调用对象到构造器的target参数,或重写子类的run()方法。除了__int__()方法和run()方法,Thread子类不应该重写除此之外的其他方法。
1、传递可调用对象到构造器的target参数的方式开启线程:

from threading import Thread
import time

def task(name):
    print(f'{name} is running')
    time.sleep(3)
    print(f'{name} is end')

if __name__ == '__main__':
    t = Thread(target=task, args=('子线程',))
    t.start()
    print('主线程 is running')

2、重写子类的run()方法的方式开启线程:

from threading import Thread
import time

class Task(Thread):

    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print(f'{self.name} is running')
        time.sleep(3)
        print(f'{self.name} is end')

if __name__ == '__main__':
    task = Task('子线程')
    task.start()
    print('主线程 is running')

2、线程与进程关系

from threading 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值