Python中的threading模块

threading-更高级别的线程接口

源代码:Lib/threading.py
该模块在较低级别thread模块之上构建更高级别的线程接口。另请参见mutex和Queue模块。

该dummy_threading模块适用于threading因thread缺失而无法使用的情况 。

threading.active_count()
threading.activeCount()

返回Thread当前活动的对象数。返回的计数等于返回的列表的长度enumerate()。

threading.Condition()
返回新条件变量对象的工厂函数。条件变量允许一个或多个线程等待,直到另一个线程通知它们。

threading.current_thread()
threading.currentThread()

返回当前Thread对象,对应于调用者的控制线程。如果未通过threading模块创建调用者的控制 线程,则返回具有有限功能的虚拟线程对象。

threading.enumerate()
返回Thread当前活动的所有对象的列表。该列表包括守护线程,由其创建的虚拟线程对象 current_thread()和主线程。它排除了尚未启动的已终止线程和线程。

threading.Event()
返回新事件对象的工厂函数。事件管理一个标志,该标志可以使用该set()方法设置为true,并使用该方法重置为false clear()。该wait()方法将阻塞,直到该标志为真。

类threading.local
表示线程局部数据的类。线程局部数据是其值是线程特定的数据。要管理线程本地数据,只需创建一个local(或子类)实例并在其上存储属性:

threading.Lock()
返回新原始锁定对象的工厂函数。一旦线程获得它,后续尝试获取它就会阻塞,直到它被释放; 任何线程都可以释放它。

threading.RLock()
返回新的可重入锁定对象的工厂函数。必须由获取它的线程释放重入锁。一旦线程获得了可重入锁,同一个线程可以再次获取它而不会阻塞; 线程必须在每次获取它时释放一次。

threading.Semaphore([ 值] )
返回新信号量对象的工厂函数。信号量管理一个计数器,表示release()呼叫数减去acquire()呼叫数 加上初始值。该acquire()方法在必要时阻止,直到它可以返回而不使计数器为负。如果没有给出,则值默认为1。

threading.BoundedSemaphore([ 值] )
返回新的有界信号量对象的工厂函数。有界信号量检查以确保其当前值不超过其初始值。如果确实如此,ValueError则被提出。在大多数情况下,信号量用于保护容量有限的资源。如果信号量被释放太多次,则表明存在错误。如果没有给出,则值默认为1。

类 threading.Thread
表示控制线程的类。该类可以以有限的方式安全地进行子类化。

类 threading.Timer
在指定的时间间隔过后执行函数的线程。

threading.settrace(func )
为从threading模块启动的所有线程设置跟踪功能。在调用sys.settrace()其run()方法之前,将为每个线程 传递 func。

threading.setprofile(func )
为从threading模块启动的所有线程设置配置文件功能。在调用sys.setprofile()其run()方法之前,将为每个线程 传递 func。

threading.stack_size([ 大小] )
返回创建新线程时使用的线程堆栈大小。可选的 size参数指定用于后续创建的线程的堆栈大小,并且必须为0(使用平台或已配置的默认值)或至少为32,768(32 KiB)的正整数值。如果未指定size,则使用0。如果不支持更改线程堆栈大小,ThreadError则引发a。如果指定的堆栈大小无效,则aValueError被提升,堆栈大小未经修改。32kB是目前支持的最小堆栈大小值,以保证解释器本身有足够的堆栈空间。请注意,某些平台可能对堆栈大小的值有特定限制,例如要求最小堆栈大小> 32kB或需要以系统内存页面大小的倍数进行分配 - 应提供平台文档以获取更多信息(4kB页面是常见的;在没有更具体的信息的情况下,建议的方法是使用4096的倍数作为堆栈大小。可用性:Windows,具有POSIX线程的系统。

异常threading.ThreadError
针对各种与线程相关的错误提出,如下所述。请注意,许多接口使用RuntimeError而不是ThreadError。

该模块的设计基于Java的线程模型。但是,在Java使锁和条件变量成为每个对象的基本行为的地方,它们是Python中的独立对象。Python的Thread类支持Java的Thread类的行为的子集; 目前,没有优先级,没有线程组,线程不能被销毁,停止,暂停,恢复或中断。Java的Thread类的静态方法在实现时会映射到模块级函数。

下面描述的所有方法都是原子执行的。

线程对象

此类表示在单独的控制线程中运行的活动。有两种方法可以指定活动:将可调用对象传递给构造函数,或者通过覆盖run()子类中的方法。不应在子类中重写其他方法(构造函数除外)。换句话说, 只 覆盖此类的init()和run()方法。

创建线程对象后,必须通过调用线程的start()方法启动其活动。这将run()在单独的控制线程中调用该方法。

一旦线程的活动开始,线程就被认为是“活着的”。当它的run()方法终止时,它会停止活动- 通常,或者通过引发未处理的异常。该is_alive()方法测试线程是否存活。

其他线程可以调用线程的join()方法。这会阻塞调用线程,直到调用其join()方法的线程终止。

线程有一个名字。名称可以传递给构造函数,并通过name属性读取或更改。

线程可以标记为“守护程序线程”。这个标志的意义在于当只剩下守护进程线程时整个Python程序退出。初始值继承自创建线程。可以通过daemon酒店设置标志。

注意:守护程序线程在关闭时突然停止。他们的资源(例如打开文件,数据库事务等)可能无法正确发布。如果您希望线程正常停止,请使它们成为非守护进程并使用合适的信令机制,例如Event。
有一个“主线程”对象; 这对应于Python程序中的初始控制线程。它不是守护程序线程。

有可能创建“虚拟线程对象”。这些是与“外部线程”相对应的线程对象,它们是在线程模块外部启动的控制线程,例如直接来自C代码。虚拟线程对象具有有限的功能; 他们总是被认为是活着的和守护的,不能被join()编辑。它们永远不会被删除,因为无法检测外来线程的终止。

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

应始终使用关键字参数调用此构造函数。参数是:

  • 小组应该None; 在实现ThreadGroup类时为将来的扩展保留 。

  • target是run()方法调用的可调用对象。默认为None,意味着什么都没有被调用。

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

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

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

如果子类重写构造函数,则必须确保Thread.init()在对线程执行任何其他操作之前调用基类构造函数()。
start()
开始线程的活动。

每个线程对象最多只能调用一次。它安排run()在单独的控制线程中调用对象的方法。

此方法将RuntimeError在同一个线程对象上多次调用if。

  • run()
    表示线程活动的方法。

您可以在子类中重写此方法。标准run() 方法调用传递给对象构造函数的可调用对象作为目标参数(如果有),分别使用args和kwargs参数中的顺序和关键字参数。

  • join([ 超时] )
    等到线程终止。这将阻塞调用线程,直到调用其join()方法的线程终止 - 正常或通过未处理的异常 - 或直到发生可选的超时。

当超时参数存在而不存在时None,它应该是一个浮点数,指定操作的超时(以秒为单位)(或其中的分数)。由于join()总是返回None,必须调用isAlive()后join()决定超时是否发生了-如果线程还活着时,join()调用超时。

  • 当timeout参数不存在时None,操作将阻塞,直到线程终止。

线程可以join()多次编辑。

  • join()提出了RuntimeError如果试图加入当前线程因为这将导致死锁。join()在线程启动之前它也是一个错误, 并且尝试这样做会引发相同的异常。

  • name
    字符串仅用于识别目的。它没有语义。多个线程可以赋予相同的名称。初始名称由构造函数设置。

ident
此线程的“线程标识符”或者None线程尚未启动。这是一个非零整数。看 thread.get_ident()功能。当线程退出并创建另一个线程时,可以回收线程标识符。即使在线程退出后,该标识符也可用。

is_alive()
isAlive()

返回线程是否存活。

此方法True在run()方法启动之前返回,直到run()方法终止之后。模块函数 enumerate()返回所有活动线程的列表。

daemon
一个布尔值,指示此线程是否为守护程序线程(True)或不是(False)。必须在start()调用之前设置,否则RuntimeError引发。它的初始值继承自创建线程; 主线程不是守护程序线程,因此在主线程中创建的所有线程都默认为daemon = False。

当没有剩下活着的非守护进程线程时,整个Python程序退出。

isDaemon()
setDaemon()

锁定对象

原始锁是一种同步原语,在锁定时不属于特定线程。在Python中,它是目前可用的最低级同步原语,由thread 扩展模块直接实现。

原始锁定处于“锁定”或“解锁”两种状态之一。它是在解锁状态下创建的。它有两种基本方法,acquire()和 release()。当状态解锁时,acquire()将状态更改为锁定并立即返回。当状态被锁定时,acquire() 阻塞直到release()另一个线程中的调用将其更改为解锁,然后该acquire()调用将其重置为已锁定并返回。该 release()方法只应在锁定状态下调用; 它将状态更改为已解锁并立即返回。如果尝试释放未锁定的锁,ThreadError则会引发a。

当acquire()等待状态转为解锁时阻塞多个线程时,只有一个线程在release()呼叫重置状态解锁时继续; 哪个等待线程继续进行未定义,并且可能因实现而异。

所有方法都以原子方式执行。

  • Lock.acquire([ 阻止] )
    获取锁定,阻止或非阻止。

当阻塞参数设置为True(默认值)时调用,阻塞直到解锁,然后将其设置为锁定并返回True。

在使用阻塞参数设置为的情况下调用时False,请勿阻止。如果一个带阻塞的调用设置为True阻塞,则False 立即返回; 否则,将锁定设置为锁定并返回True。

  • Lock.release()
    解锁。

锁定锁定后,将其重置为解锁状态,然后返回。如果阻止任何其他线程等待锁解锁,则只允许其中一个继续执行。

在未锁定的锁上调用时,ThreadError会引发a。

没有回报价值。

  • RLock对象

可重入锁是同步原语,可以由同一线程多次获取。在内部,除了原始锁使用的锁定/解锁状态之外,它还使用“拥有线程”和“递归级别”的概念。在锁定状态下,某些线程拥有锁; 在解锁状态下,没有线程拥有它。

要锁定锁,线程会调用其acquire()方法; 一旦线程拥有锁,它就会返回。要解锁锁,线程会调用其 release()方法。acquire()/ release()call对可以嵌套; 只有最后一个release()(release()最外面的一对)重置锁才能解锁并允许另一个被阻塞的线程 acquire()继续进行。

  • RLock.acquire([ blocking = 1 ] )
    获取锁定,阻止或非阻止。

在不带参数的情况下调用:如果此线程已拥有锁,则将递归级别递增1,并立即返回。否则,如果另一个线程拥有该锁,则阻塞直到锁被解锁。锁解锁后(不属于任何线程),然后获取所有权,将递归级别设置为1,然后返回。如果多个线程被阻塞等待锁解锁,则一次只能有一个线程获取锁的所有权。在这种情况下没有返回值。

在将blocking参数设置为true的情况下调用时,执行与不带参数调用时相同的操作,并返回true。

在将blocking参数设置为false的情况下调用时,请勿阻止。如果没有参数的调用会阻塞,则立即返回false; 否则,执行与不带参数调用时相同的操作,并返回true。

RLock.release()
释放锁定,递减递归级别。如果在递减之后它为零,则将锁重置为未锁定(不由任何线程拥有),并且如果阻止任何其他线程等待锁解锁,则允许其中一个继续进行。如果在递减之后递归级别仍然非零,则锁保持锁定并由调用线程拥有。

仅在调用线程拥有锁时调用此方法。RuntimeError如果在锁定解锁时调用此方法,则引发A.

没有回报价值。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值