文章目录
使用threading模块
python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用
import time
import threading
def miao():
"""喵喵 5秒钟"""
for i in range(5):
print("---喵喵喵---")
time.sleep(1)
def wang():
"""汪汪 5秒钟"""
for i in range(5):
print("---汪汪汪---")
time.sleep(1)
def main():
t1 = threading.Thread(target=miao)
t2 = threading.Thread(target=wang)
t1.start()
t2.start()
if __name__ == "__main__":
main()
- 可以明显看出使用了多线程并发的操作,喵喵和汪汪同时进行
查看线程数量
我们可以调用threading中的enumerate方法来查看线程的数量
import threading
import time
def test1():
for i in range(5):
print("........test1....%d..." % i)
time.sleep(1)
def test2():
for i in range(10):
print("........test2....%d..." % i)
time.sleep(1)
def main():
# # 线程执行的顺序不确定,可以设置适当的延迟来保证某些线程先进行
# 运行这部分是test1和test2中没有睡眠部分
# t1 = threading.Thread(target=test1)
# t2 = threading.Thread(target=test2)
# t1.start()
# time.sleep(1)
# print("--1--")
# t2.start()
# time.sleep(1)
# print("--2--")
# print(threading.enumerate())
# # 循环查看当前运行的线程 如果创建thread时执行的函数运行结束,那么这个子线程就结束了
# t1 = threading.Thread(target=test1)
# t2 = threading.Thread(target=test2)
# t1.start()
# t2.start()
# while True:
# print(threading.enumerate())
# time.sleep(1)
# if len(threading.enumerate()) <= 1:
# break
# 验证线程创建时间 当调用thread时不会创建线程,当调用实例对象的start方法的时候才会创建线程以及线程开始运行
print(threading.enumerate(),"01")
t1 = threading.Thread(target=test1)
print(threading.enumerate(), "02")
t1.start()
print(threading.enumerate(),"03")
if __name__ == "__main__":
main()
说明:
- 里面有三部分代码
- 第一部分我们在将睡眠都去掉之后我们可以看到,CPU选择运行各个进程的顺序每次都是不同的,我们可以添加适当的睡眠来调整各个线程执行的顺序
- 第二部分我们可以看到,当创建子进程的函数运行完毕之后,子进程自己会结束,而当主进程结束的时候整个程序就会结束,一般情况下主进程都会再子进程都结束后才结束
- 第三部分我们可以验证子进程创建的时间,即Thread创建的实例对象调用start方法的时候子进程才会被创建出来并开始运行