版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39591494/article/details/89196205
Thread类:
Thread类是threading模块中最常用的功能,通过调用用户指定函数func
,用于独立生成一个活动线程。调用用户指定函数func
,可以有两种方法:一是在Thread创建实例对象时,把func
以参数的形式传递给构造函数;二是通过继承Thread
类重写run
方法,调用func
函数,在Thread
的子类中,只允许__init__()
和run()
方法进行重写。
Thread(group=None, target=None, name=None, args=(), kwargs=None, daemon=None)
- group:用于保留,作为将来的扩展功能,可以忽略该参数,或设置group=none
- target:设置线程需要执行的自定义函数,如target=func设置完成后被run()方法调用; 当target=none时,线程不执行任何操作。
- name:指定需要执行的线程名称。不指定时,该类自动生成一个Thread-N形式的线程名称。
- args:当自定义函数func带有参数时,把参数以元组的形式通过args传递给func
- kwargs:当自定义函数的func带有参数时,把参数以字典的形式通过kwargs传递给func
- daemon:当daemon不是none时,通过设置True&False确定是否守护进程。
Thread类的主要方法:
方法名称 | 使用描述 |
---|---|
start() | 线程启动状态(一个线程对象只能调用该方法一次),该方法必须在run()方法前被调用 |
run() | 运行线程,使线程处于活动状态,在run()方法里执行指定的用户自定义函数func,该方法可以在Thread子类被重写 |
join(timeout=None) | 阻塞调用线程。等待调用该方法的线程对象运行,一直到该线程执行终止,阻塞才释放。timeout为可选参数,可以设置阻塞时间(以秒为单位)当timeout参数不存在或者为none时,该操作将阻塞,直到线程终止。该方法运行在run()方法后 |
name | 线程名称,初始名称由构造函数设置 |
is_alive() | 返回线程是否存在 |
daemon | 显示此线程是否为守护程序线程(True)或不(False)的布尔值。这必须在调用start() 之前设置,否则会引发runtimeError。 |
一旦一个线程对象被创建,其活动必须通过调用线程的start()方法来启动,然后调用run()方法执行指定的用户自定义函数func。join方法在run()方法后执行。这会阻塞调用线程,直到调用join方法的线程运行终止,才能执行后续的程序代码。
使用join方法:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time
import threading
from threading import Thread
def countdown(n):
while n > 0:
print(f"线程名字为:{threading.current_thread().getName()},正在减数:", n)
n -= 1
time.sleep(1)
def main():
"""
Thread(group=None, target=None, name=None, args=(), kwargs=None, daemon=None)
A class that represents a thread of control.
"""
# Thread(target=work_name).start()
Thread_list = []
logging.debug('start')
for i in range(3):
t = Thread(target=countdown, args=(3, )) # 启动3个线程运行countdown函数
t.start()
Thread_list.append(t)
for i in Thread_list:
i.join() # Wait until the thread terminates. # 终止
logging.debug('stop')
if __name__ == "__main__":
main()
>>>
线程名字为:Thread-1,正在减数: 3
线程名字为:Thread-2,正在减数: 3
线程名字为:Thread-3,正在减数: 3
线程名字为:Thread-3,正在减数: 2
线程名字为:Thread-1,正在减数: 2
线程名字为:Thread-2,正在减数: 2
线程名字为:Thread-3,正在减数: 1
线程名字为:Thread-1,正在减数: 1
线程名字为:Thread-2,正在减数: 1
加入log:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time
import logging
import threading
from threading import Thread
logging.basicConfig(
level=logging.DEBUG,
format='%(threadName)-10s:%(message)s' # threadName:自动获取线程名字 message:输出信息
)
def countdown(n):
while n > 0:
# print(f"线程名字为:{threading.current_thread().getName()},正在减数:{n}")
logging.debug(f"正在减数:{n}") # 通过日志输出信息
n -= 1
time.sleep(1)
def main():
"""
Thread(group=None, target=None, name=None, args=(), kwargs=None, daemon=None)
A class that represents a thread of control.
"""
# Thread(target=work_name).start()
Thread_list = []
for i in range(3):
t = Thread(target=countdown, args=(3, )) # 启动3个线程运行countdown函数
t.start()
Thread_list.append(t)
for i in Thread_list:
i.join() # Wait until the thread terminates. # 终止
if __name__ == "__main__":
main()
>>>
MainThread:start
Thread-1 :正在减数:3
Thread-2 :正在减数:3
Thread-3 :正在减数:3
Thread-2 :正在减数:2
Thread-3 :正在减数:2
Thread-1 :正在减数:2
Thread-2 :正在减数:1
Thread-1 :正在减数:1
Thread-3 :正在减数:1
MainThread:stop