目錄
1、併發與並行
並行:兩個或多個事件在同一時刻(同一時間點)發生
併發:兩個或多個事件在同一時間段發生
並行指的多個cpu,併發主要針對一個cpu
併發的目的是充分利用服務器的每一個核,以達到最高處理性能
2、多線程編程
2-1多線程的實現
2-1-1實例化Thread
例1:
from threading import Thread
import time
def sleep_task(sleep_time):
print("start spleep {}s".format(sleep_time))
time.sleep(3)
print("end spleep {}s".format(sleep_time))
if __name__ == '__main__':
t1 = Thread(target=sleep_task,args=(3,))
t2 = Thread(target=sleep_task,args=(2,))
t1.start()
t2.start()
print("main end")
結果如下:
start spleep 3s
start spleep 2s
main end
end spleep 3s
end spleep 2s
需要注意的是:
1、在實例化的過程中,參數target的值爲方法名, 如target=sleep_task,而非target=sleep_task()。
2、在實例化的過程中,參數args的值所需格式爲Iterable。如int類型的3,放在元組中需寫爲(3,)。
知識點:
當一個進程啓動之後,會默認產生一個主線程,因爲線程是程序執行流的最小單元,當設置多線程時,主線程會創建多個子線程,在python中,默認情況下(其實就是setDaemon(False)),主線程執行完自己的任務以後,就退出了,此時子線程會繼續執行自己的任務,直到自己的任務結束。
2-1-2繼承Thread
from threading import Thread
import time
class sleepThrad(Thread):
def __init__(self,sleep_time):
self.sleep_time = sleep_time
super().__init__()#子類調用父類的__init__()方法進行必要的初始化
def run(self):
print("sleep {} seconds start".format(self.sleep_time))
time.sleep(self.sleep_time)
print("sleep {} seconds end".format(self.sleep_time))
if __name__ == '__main__':
t1 = sleepThrad(2)
t2 = sleepThrad(3)
t1.start()
t2.start()
print("main end")
結果如下:
start spleep 3s
start spleep 2s
main end
end spleep 3s
end spleep 2s
2-2 join()方法
join所完成的工作就是線程同步,即主線程任務結束之後,進入阻塞狀態,一直等待其他的子線程執行結束之後,主線程再終止。
如下例子:
from threading import Thread
import time
def sleep_task(sleep_time):
print("start spleep {}s".format(sleep_time))
time.sleep(3)
print("end spleep {}s".format(sleep_time))
if __name__ == '__main__':
t1 = Thread(target=sleep_task,args=(3,))
t2 = Thread(target=sleep_task,args=(2,))
t1.start()
t2.start()
t1.join()
t2.join()
print("main end")
輸入結果爲:
start spleep 3s
start spleep 2s
end spleep 3s
end spleep 2s
main end
2-3setDaemon(True)
當我們使用setDaemon(True)方法,設置子線程爲守護線程時,主線程一旦執行結束,則全部線程全部被終止執行,可能出現的情況就是,子線程的任務還沒有完全執行結束,就被迫停止。例子如下:
from threading import Thread
import time
def sleep_task(sleep_time):
print("start spleep {}s".format(sleep_time))
time.sleep(3)
print("end spleep {}s".format(sleep_time))
if __name__ == '__main__':
t1 = Thread(target=sleep_task,args=(3,))
t2 = Thread(target=sleep_task,args=(2,))
t2.setDaemon(True)
t1.start()
t2.start()
print("main end")
結果如下:
start spleep 3s
start spleep 2s
main end
end spleep 3s
注意請確保setDaemon()在start()之前。