python threading --- 基于线程的并行
Posted 天亮yǐ后
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python threading --- 基于线程的并行相关的知识,希望对你有一定的参考价值。
threading
--- 基于线程的并行
这个模块在较低级的模块 _thread
基础上建立较高级的线程接口。
这个模块定义了以下函数:
threading.
active_count
()-
返回当前存活的线程类
Thread
对象。返回的计数等于enumerate()
返回的列表长度。
threading.
get_ident
()-
返回当前线程的 “线程标识符”。它是一个非零的整数。它的值没有直接含义,主要是用作 magic cookie,比如作为含有线程相关数据的字典的索引。线程标识符可能会在线程退出,新线程创建时被复用。
3.3 新版功能.
threading.
enumerate
()-
以列表形式返回当前所有存活的
Thread
对象。 该列表包含守护线程,current_thread()
创建的虚拟线程对象和主线程。它不包含已终结的线程和尚未开始的线程。
threading.
main_thread
()-
返回主
Thread
对象。一般情况下,主线程是Python解释器开始时创建的线程。3.4 新版功能.
threading.
settrace
(func)-
为所有
threading
模块开始的线程设置追踪函数。在每个线程的run()
方法被调用前,func 会被传递给sys.settrace()
。
threading.
setprofile
(func)-
为所有
threading
模块开始的线程设置性能测试函数。在每个线程的run()
方法被调用前,func 会被传递给sys.setprofile()
。
threading.
stack_size
([size])-
返回创建线程时用的堆栈大小。可选参数 size 指定之后新建的线程的堆栈大小,而且一定要是0(根据平台或者默认配置)或者最小是32,768(32KiB)的一个正整数。如果 size 没有指定,默认是0。如果不支持改变线程堆栈大小,会抛出
RuntimeError
错误。如果指定的堆栈大小不合法,会抛出ValueError
错误并且不会修改堆栈大小。32KiB是当前最小的能保证解释器有足够堆栈空间的堆栈大小。需要注意的是部分平台对于堆栈大小会有特定的限制,例如要求大于32KiB的堆栈大小或者需要根据系统内存页面的整数倍进行分配 - 应当查阅平台文档有关详细信息(4KiB页面比较普遍,在没有更具体信息的情况下,建议的方法是使用4096的倍数作为堆栈大小)。适用于: Windows,具有 POSIX 线程的系统。
这个模块同时定义了以下常量:
threading.
TIMEOUT_MAX
-
阻塞函数(
Lock.acquire()
,RLock.acquire()
,Condition.wait()
, ...)中形参 timeout 允许的最大值。传入超过这个值的 timeout 会抛出OverflowError
异常。3.2 新版功能.
这个模块定义了许多类,详见以下部分。
该模块的设计基于 Java的线程模型。 但是,在Java里面,锁和条件变量是每个对象的基础特性,而在Python里面,这些被独立成了单独的对象。 Python 的 Thread
类只是 Java 的 Thread 类的一个子集;目前还没有优先级,没有线程组,线程还不能被销毁、停止、暂停、恢复或中断。 Java 的 Thread 类的静态方法在实现时会映射为模块级函数。
下列描述的方法都是自动执行的。
-
一旦线程活动开始,该线程会被认为是 ‘存活的‘ 。当它的
run()
方法终结了(不管是正常的还是抛出未被处理的异常),就不是‘存活的‘。is_alive()
方法用于检查线程是否存活。 -
线程有名字。名字可以传递给构造函数,也可以通过
name
属性读取或者修改。 -
一个线程可以被标记成一个 "守护线程" 。这个标志的意义是,只有守护线程都终结,整个Python程序才会退出。初始值继承于创建线程。这个标志可以通过
daemon
特征属性或者 守护 构造函数参数来设置。
注解:守护线程在程序关闭时会突然关闭。他们的资源(例如已经打开的文档,数据库事务等等)可能没有被正确释放。如果你想你的线程正常停止,设置他们成为非守护模式并且使用合适的信号机制
6.有个 "主线程" 对象;这对应Python程序里面初始的控制线程。它不是一个守护线程。
7."虚拟线程对象" 是可以被创建的。这些是对应于“外部线程”的线程对象,它们是在线程模块外部启动的控制线程,例如直接来自C代码。虚拟线程对象功能受限;他们总是被认为是存活的和守护模式,不能被 join()
。因为无法检测外来线程的终结,它们永远不会被删除。
以上是关于python threading --- 基于线程的并行的主要内容,如果未能解决你的问题,请参考以下文章