一、简介
- 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