Python线程模块
Python提供了几个用于多线程编程的模块,包括thread、threading和Queue等。thread和threading模块允许程序员创建和管理线程。thread模块提供了基本的线程和锁的支持,threading提供了更高级别、功能更强的线程管理的功能。Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。
避免使用thread模块,因为更高级别的threading模块更为先进,对线程的支持更为完善,而且使用thread模块里的属性有可能会与threading出现冲突;其次低级别的thread模块的同步原语很少(实际上只有一个),而threading模块则有很多;再者,thread模块中当主线程结束时,所有的线程都会被强制结束掉,没有警告也不会有正常的清除工作,至少threading模块能确保重要的子线程退出后进程才退出。
就像我们熟悉的time模块,它比其他模块更加接近底层,越是接近底层,用起来越麻烦,就像时间日期转换之类的就比较麻烦,但是后面我们会学到一个datetime模块,提供了更为简便的时间日期处理方法,它是建立在time模块的基础上来的。又如socket和socketserver(底层还是用的socket)等等,这里的threading就是thread的高级模块。
thread模块不支持守护线程,当主线程退出时,所有的子线程不论它们是否还在工作,都会被强行退出。而threading模块支持守护线程,守护线程一般是一个等待客户请求的服务器,如果没有客户提出请求它就在那等着,如果设定一个线程为守护线程,就表示这个线程是不重要的,在进程退出的时候,不用等待这个线程退出。
创建线程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from threading import Thread
import threading,time
def work():
time.sleep(2)
print('我是线程')
if __name__ == '__main__':
#在主进程下开启线程
t = Thread(target=work,)
t.start()
print(threading.current_thread()) #主线程对象
print(threading.current_thread().getName()) #主线程名称
print(threading.current_thread().ident) #主线程ID
print(threading.get_ident()) #查看当前线程ID,即主线程ID
print(threading.enumerate()) #返回一个包含正在运行的线程的list
print(threading.active_count()) #返回正在运行的线程数量
'''打印结果:
<_MainThread(MainThread, started 16728)>
MainThread
16728
16728
[<_MainThread(MainThread, started 16728)>, <Thread(Thread-1, started 8180)>]
2
我是线程
'''
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from threading import Thread
class Xiancheng(Thread):
def __init__(self,id):
super().__init__()
self.id = id
def run(self):
print('我是线程2')
if __name__ == '__main__':
t = Xiancheng(222)
t.start()
print(t.getName())
print(t.ident)
print(t.isAlive()) #此为False或True,因为线程运行一下就结束了 没结束时状态便为True
'''
我是线程2
Thread-1
872
False
'''