话不多说,直接开始吧
调入模块:
import threading
threading的几个方法
创建线程对象:
t1 = threading.Thread(target=output, args=("小明",))
target : 线程所要执行的函数的名称
args :函数的参数
启动线程:
t1.start()
将线程设置为守护线程:
t1.setDaemon(True)
设置主线程等待子线程结束:
t1.join()
下面通过不同的实例来展示一下不同方法的作用
import threading
import time
print(time.asctime(time.localtime(time.time()))) #记录开始时间
def output(hh): #所要执行的函数
print("nihao %s" % hh)
time.sleep(2)
print(time.asctime(time.localtime(time.time()))) #记录每个子线程结束的时间
def main(): #创建6个子线程
t1 = threading.Thread(target=output, args=("小明",))
t2 = threading.Thread(target=output, args=("小红",))
t3 = threading.Thread(target=output, args=("小刚",))
t4 = threading.Thread(target=output, args=("小文",))
t5 = threading.Thread(target=output, args=("小康",))
t6 = threading.Thread(target=output, args=("小莉",))
t1.start()
t2.start()
t3.start()
t4.start()
t5.start()
t6.start()
print("我要结束了哦")
if __name__ == '__main__':
main()
执行结果:
Fri Jun 12 17:24:56 2020
nihao 小明
nihao 小红
nihao 小刚
nihao 小文
nihao 小康
nihao 小莉我要结束了哦
Fri Jun 12 17:24:58 2020Fri Jun 12 17:24:58 2020
Fri Jun 12 17:24:58 2020Fri Jun 12 17:24:58 2020Fri Jun 12 17:24:58 2020
Fri Jun 12 17:24:58 2020
这里可以看到,各个子线程执行完是在同一时间,从开始到结束用了2秒钟。(输出结果顺序混乱是多线程的正常现象)
要注意的是,主线程运行完之后并没有直接结束,而是等待各个子线程结束之后才结束,这是非守护线程的效果。
import threading
import time
print(time.asctime(time.localtime(time.time()))) #记录开始时间
def output(hh): #所要执行的函数
print("nihao %s" % hh)
time.sleep(2)
print(time.asctime(time.localtime(time.time()))) #记录每个子线程结束的时间
def main(): #创建6个子线程
t1 = threading.Thread(target=output, args=("小明",))
t2 = threading.Thread(target=output, args=("小红",))
t3 = threading.Thread(target=output, args=("小刚",))
t4 = threading.Thread(target=output, args=("小文",))
t5 = threading.Thread(target=output, args=("小康",))
t6 = threading.Thread(target=output, args=("小莉",))
t1.setDaemon(True)
t2.setDaemon(True) #设置为守护进程
t3.setDaemon(True)
t4.setDaemon(True)
t5.setDaemon(True)
t6.setDaemon(True)
t1.start()
t2.start()
t3.start()
t4.start()
t5.start()
t6.start()
print("我要结束了哦")
if __name__ == '__main__':
main()
执行结果:
Fri Jun 12 17:38:31 2020
nihao 小明
nihao 小红
nihao 小刚
nihao 小文
nihao 小康
nihao 小莉我要结束了哦
这里可以看到,当所有子线程都设置为守护线程时,主线程运行完之后就直接结束了,而没有等待子线程结束,导致子线程没有运行完。
import threading
import time
print(time.asctime(time.localtime(time.time()))) #记录开始时间
def output(hh):
print("nihao %s" % hh)
time.sleep(2)
print(time.asctime(time.localtime(time.time()))) #记录每个子线程结束的时间
def main(): #创建6个子线程
t1 = threading.Thread(target=output, args=("小明",))
t2 = threading.Thread(target=output, args=("小红",))
t3 = threading.Thread(target=output, args=("小刚",))
t4 = threading.Thread(target=output, args=("小文",))
t5 = threading.Thread(target=output, args=("小康",))
t6 = threading.Thread(target=output, args=("小莉",))
t1.setDaemon(True)
t2.setDaemon(True)
t3.setDaemon(True)
t4.setDaemon(True)
t5.setDaemon(True)
t6.setDaemon(True)
t1.start()
t2.start()
t3.start()
t4.start()
t5.start()
t6.start()
t1.join()
t2.join()
t3.join()
t4.join()
t5.join()
t6.join()
print("我要结束了哦")
if __name__ == '__main__':
main()
执行结果:
Fri Jun 12 18:00:39 2020
nihao 小明
nihao 小红
nihao 小刚
nihao 小文
nihao 小康
nihao 小莉
Fri Jun 12 18:00:41 2020
Fri Jun 12 18:00:41 2020Fri Jun 12 18:00:41 2020
Fri Jun 12 18:00:41 2020Fri Jun 12 18:00:41 2020
Fri Jun 12 18:00:41 2020
我要结束了哦
我们可以看到,当设置了主线程等待子线程结束,子线程都运行完之后主线程才运行完。
使用.join() 方法和直接创建非守护进程的区别是:
使用 .join() 方法,主线程会等待子线程都运行完之后才执行后面的语句,所以主线程结束时,子线程肯定是已经运行完的。
直接创建非守护进程,主线程和子线程会同时运行,如果主线程运行完早于子线程,这时主线程会等待子线程运行完之后才结束。
import threading
import time
print(time.asctime(time.localtime(time.time()))) #记录开始时间
def output(hh):
print("nihao %s" % hh)
time.sleep(2)
print(time.asctime(time.localtime(time.time()))) #记录每个子线程结束的时间
if __name__ == '__main__':
thread_list = []
for i in range(10):
t = threading.Thread(target=output,args=("帅哥",))
t.start()
thread_list.append(t)
for thread in thread_list:
thread.join()
执行结果:
Fri Jun 12 19:40:57 2020
nihao 帅哥
nihao 帅哥
nihao 帅哥
nihao 帅哥
nihao 帅哥
nihao 帅哥
nihao 帅哥
nihao 帅哥
nihao 帅哥
nihao 帅哥
Fri Jun 12 19:40:59 2020
Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020
Fri Jun 12 19:40:59 2020
Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020
Fri Jun 12 19:40:59 2020
Fri Jun 12 19:40:59 2020
Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020
所有子线程都是在同一时刻结束。
讲解的不正确的地方,还请大神指出,我们共同进步。