線程
一、線程模塊
二、Thread(類)
三、join & setDaemon
join
setDaemon
四、創建線程
方法1:實例Thread類
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:DM time:2019/8/2 20:49
from threading import Thread
import time
def f1(people):
print("hello,{}".format(people))
time.sleep(3)
print("bye")
def f2():
print("hi")
time.sleep(3)
print("goodbye")
if __name__ == '__main__':
# 1.正常調用,是有先後順序,主線程
f1()
f2()
# 2.線程操作
f1_thread = Thread(target=f1, args=("胡歌",), name='hello') # 創建了一個線程實例
f2_thread = Thread(target=f2, name='hi') # 實例對象時,函數並未執行
# 設置線程名稱
f1_thread.setName("dai")
f1_thread.setName("hu")
print("f1 name:", f1_thread.getName())
print("f2 name:", f2_thread.getName())
# 守護線程
# f1_thread.setDaemon(True) # 在主線程執行完畢後,強行結束子線程,程序結束
# f2_thread.setDaemon(True)
# 運行線程
f1_thread.start() # 調用start方法纔開始執行
f2_thread.start()
# 阻塞調用
f1_thread.join() # 阻塞調用,主線程進行等待
f2_thread.join()
# 若不調用阻塞,在主線程執行完畢後並不會立即結束程序,而是等子程序執行完畢後,才結束程序
print("主線程執行完畢")
"""
主線程執行完畢了,但是子線程依然沒有關閉(或陷入死循環),程序則一直無法關閉,於是出現了守護線程
守護線程:主線程執行完畢後,程序就關閉
"""
方法2:繼承並重寫Thread類
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:DM time:2019/8/2 21:15
from threading import Thread
import time
# 1.方式一(不太適用,因爲不能接收參數)
class MyThread(Thread):
def run(self):
print('hello')
time.sleep(3)
print('bye')
my_thread = MyThread() # 創建一個線程實例
my_thread.start()
# 重寫了類中run方法,通過start方法自動去調用類中的run方法
# 2.方式二
class MyThread(Thread):
def __init__(self, people, *args, **kwargs):
super().__init__(*args, **kwargs) # 繼承父類構造方法
self.people = people
# 爲了展示效果而重寫的run方法(可忽略)
def run(self):
print('hello,{}'.format(self.people))
time.sleep(3)
print('bye')
my_thread = MyThread("齊時久", name="hello") # 創建一個線程實例
print(my_thread.getName())
my_thread.start()