目录
1. 并行和并发
2. 进程和线程的概念
3. 线程的状态
4. python中的线程开发
Thread类
线程启动
threading的属性和方法
Thread实例的属性和方法
run方法
在理解进程和线程的概念之前,先了解什么是并行,什么是并发以及并发的解决方案都有哪些?
并行:同一时刻互不干扰的做几件事,例如三个独立的车道分别行驶三辆车
并发:一段时间内处理几件事,例如,多个车辆在某一时段通过同一段路
并发的解决
进程:
线程:
进程、线程的理解
状态 | 含义 |
---|---|
就绪(Ready) | 线程能够运行,但在等待被调度。可能线程刚刚创建启动,或刚刚从阻塞中恢复,或者被其他线程抢占 |
运行(Running) | 线程正在运行 |
阻塞(Blocked) | 线程等待外部事件发生而无法运行,如I/0操作 |
终止(Terminated) | 线程完成,或退出,或被取消 |
线程状态的转换
进程会启动一个解释器进程,线程共享一个解释器进程
python的线程开发使用标准库threading
def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, *, daemon=None):
线程的启动和退出
start()方法:启动线程。每一个线程必须且只能执行该方法一次
运行时默认创建一个主线程,start()方法可以创建子线程
示例:
import threading
def add(x, y):
print("test thread")
s = x+y
print(s)
print("主线程")
t1 = threading.Thread(target=add,name='add',args=(4,5))
t2 = threading.Thread(target=add,name='add',kwargs={'x':1,'y':2})
t1.start()
t2.start()
Python没有提供线程退出的方法,线程在下面情况时退出
名称 | 含义 |
---|---|
current_thread() | 返回当前线程对象 |
main_thread() | 返回主线程对象 |
active_count() | 当前处于alive状态的线程个数 |
enumerate() | 返回所有活着的线程的列表,不包括已经终止的线程和未开始的线程 |
get_ident() | 返回当前线程的ID,非0整数 |
active_count、enumerate方法返回的值还包括主线程
示例:
import threading
import time
def add(x, y):
s = x+y
print(s)
time.sleep(5)
showthread()
print("当前线程名称:",threading.currentThread().name)
def showthread():
print("current_thread:",threading.current_thread())
print("main_thread:", threading.main_thread())
print("active_count:", threading.active_count())
print("thread_id",threading.get_ident())
t1 = threading.Thread(name='add',target=add,args=(4,5))
t1.start()
名称 | 含义 |
---|---|
name | 线程名字,名称可以重名。getName()、setName()获取、设置名称 |
ident | 线程ID,它是非0整数。线程启动后才会有ID,否则为None。 线程退出,此ID依旧可以访问。此ID可以重复使用 |
is_alive() | 返回线程是否活着 |
注:线程的name这是一个名称,可以重复;ID必须唯一,但可以在线程退出后再利用
运行线程函数,不启动新线程,在主线程中执行
import threading
def add(x, y):
print("test thread")
s = x+y
print(s)
print("主线程")
class MyThread(threading.Thread):
def start(self) -> None:
print("start")
super().start()
def run(self) -> None:
print("run")
super().run()
t1 = MyThread(target=add,name='add',args=(4,5))
t2 = threading.Thread(target=add,name='add',kwargs={'x':1,'y':2})
t1.start()
t2.run()
start()和run() 方法的区别
因此,启动线程请使用start方法,才能启动多个线程。