线程基础
01.使用threading()库可以实现多线程。
- 线程声明的格式为:
threading.Thread(group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None)
- target,要使用多线程的函数对象。
- args,为目标函数传递的实参,其值为一个元组。
- kwargs,为目标函数传递的关键字参数,其值为一个字典。
- name,多线程的名称。
- 线程的简单示例:
import threading
import time
def display(x):
count = 0
# 当count大于x时线程结束
while True:
if count > x:
raise Exception("Thread Error")
time.sleep(2)
print("this is a child thread!, count is {}".format(count))
print("i will not stop even main thread stop!")
count += 1
if __name__ == "__main__":
# 创建一个线程,目标为display函数,使用关键字传参数
t = threading.Thread(target=display, name='test', kwargs={"x": 5})
t.start()
# 主线程执行,等待子线程结束后退出
print("i am main thread, now i closed!")
- threading.Thread()之外的代码逻辑为主线程,threading.Thread()创建的实例对象为工作线程。
- 主线程执行全部的代码后,会等待工作线程全部执行完之后再退出;若主线程强行退出,则工作线程也会退出。
- 工作线程有诸如while True之类的代码逻辑,可以确保工作线程永远执行,而主进程也不会退出。
- python的线程没有优先级,线程也不能被销毁,停止,挂起,结束线程的方式仅包含:
- 线程函数内的语句正常执行完毕。
- 线程函数中抛出未处理的异常。
02.线程的属性和方法:
- threading的方法包括:
- current_thread(),返回当前线程对象。
- main_thread(),返回主线程对象。
- active_count(),当前处于alive状态的线程个数,包括主线程。
- enumerate(),返回所有或活着的线程的列表,不包括已经终止的线程和未开始的线程。
- get_ident(),返回当前线程的id,其值为非0整数。
- threading.Thread实例的属性和方法包括:
- name,线程的名称,只是一个标记,可以重名;可以通过getName(),setName()获取和设置。
- ident,线程id,它是非0整数,线程启动后才会有id,否者为None。
- 线程退出,线程id依旧可以访问。
- 线程id不能重名,但可以重复使用。
- is_alive(),返回线程是否存活。
- start(),启动一个线程,每一个线程必须且只能执行该方法一次。
- run(),运行线程函数,该调用会在主线程中直接运行而不会另起一个线程,因此会阻塞(挂起主进程)。
- 同一个线程对象只能被调用一次,比如:
import threading
import time
def display(x):
count = 0
while True:
if count > x:
raise Exception("Thread Error")
time.sleep(1)
print("this is a child thread!, count is {}".format(count))
print("Thread name is {} and Thread id is {}".format(t.name, t.ident))
count += 1
print("Thread is working......")
if __name__ == "__main__":
t = threading.Thread(name='thread_test', target=display, args=(5,))
t.start()
while True:
time.sleep(1)
if t.is_alive():
print("thread is alive, name is {} and id is {}".format(t.name, t.ident))
else:
print("thread is stopped!")
t.start()
print("i am main thread, now i closed!")
- t已经运行过一次,当t终止时,不能第二次启动;如果需要启动,则必须创建一个新的线程。
03.线程的注意事项:
- 线程需要被操作系统调度,有上下文切换的成本,因此不是越多越好。
- 提高每个线程的执行效率,比增加多个线程更重要。
文档更新时间: 2021-10-04 00:19 作者:闻骏