python threading --- 基于线程的并行

Posted 天亮yǐ后

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python threading --- 基于线程的并行相关的知识,希望对你有一定的参考价值。

threading --- 基于线程的并行

这个模块在较低级的模块 _thread 基础上建立较高级的线程接口。

这个模块定义了以下函数:

threading.active_count()

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

threading.current_thread()

返回当前对应调用者的控制线程的 Thread 对象。如果调用者的控制线程不是利用 threading 创建,会返回一个功能受限的虚拟线程对象。

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 类的静态方法在实现时会映射为模块级函数。

下列描述的方法都是自动执行的。

  1. 当线程对象一但被创建,其活动一定会因调用线程的 start() 方法开始。这会在独立的控制线程调用 run() 方法。

  2. 一旦线程活动开始,该线程会被认为是 ‘存活的‘ 。当它的 run() 方法终结了(不管是正常的还是抛出未被处理的异常),就不是‘存活的‘。 is_alive() 方法用于检查线程是否存活。

  3. 其他线程可以调用一个线程的 join() 方法。这会阻塞调用该方法的线程,直到被调用 join() 方法的线程终结。

  4. 线程有名字。名字可以传递给构造函数,也可以通过 name 属性读取或者修改。

  5. 一个线程可以被标记成一个 "守护线程" 。这个标志的意义是,只有守护线程都终结,整个Python程序才会退出。初始值继承于创建线程。这个标志可以通过 daemon 特征属性或者 守护 构造函数参数来设置。

注解:守护线程在程序关闭时会突然关闭。他们的资源(例如已经打开的文档,数据库事务等等)可能没有被正确释放。如果你想你的线程正常停止,设置他们成为非守护模式并且使用合适的信号机制

  6.有个 "主线程" 对象;这对应Python程序里面初始的控制线程。它不是一个守护线程。

     7."虚拟线程对象" 是可以被创建的。这些是对应于“外部线程”的线程对象,它们是在线程模块外部启动的控制线程,例如直接来自C代码。虚拟线程对象功能受限;他们总是被认为是存活的和守护模式,不能被 join() 。因为无法检测外来线程的终结,它们永远不会被删除。

以上是关于python threading --- 基于线程的并行的主要内容,如果未能解决你的问题,请参考以下文章

Python初学 调用基类应该怎么写

Python中的抽象基类

Python中的抽象基类

python中,怎么在继承类中调用基类的方法

Python 接口:从协议到抽象基类

python 怎样调用基类函数