并发编程--多线程
目錄
- 多線程
- 什么是線程
- 進(jìn)程和線程的對(duì)比
- 使用線程的優(yōu)勢(shì)
- 線程的使用
- 線程安全問題
- 守護(hù)線程
- 線程中的常用屬性和方法
多線程
什么是線程
進(jìn)程是操作系統(tǒng)可以調(diào)度已經(jīng)進(jìn)行資源分配的基本單位,是一個(gè)資源單位,其中包含了運(yùn)行這個(gè)程序所需的資源
- 線程是操作系統(tǒng)可以運(yùn)算調(diào)度的最小單位,是真正的執(zhí)行單位,其包含在進(jìn)程中, 一個(gè)線程就是一條固定的控制流程, 一個(gè)進(jìn)程可以包含多個(gè)線程,同一進(jìn)程中的線程共享進(jìn)程內(nèi)的資源
特點(diǎn):系統(tǒng)會(huì)為每一個(gè)進(jìn)程自動(dòng)創(chuàng)建一條線程,稱之為主線程, 后續(xù)通過代碼開啟的線程稱之為子線程
進(jìn)程和線程的對(duì)比
計(jì)算機(jī)是一個(gè)工廠,進(jìn)程就是一個(gè)車間,線程就是車間內(nèi)的流水線
| 單位 | 資源單位 | 執(zhí)行單位 |
| 創(chuàng)建開銷 | 開銷大 | 開銷小 |
| 內(nèi)存關(guān)系 | 內(nèi)存相互隔離 | 共享進(jìn)程內(nèi)的所有資源 |
| 硬件資源 | 競(jìng)爭關(guān)系 | 協(xié)作關(guān)系 |
| 層級(jí)關(guān)系 | 又上下層關(guān)系 | 平等關(guān)系 |
使用線程的優(yōu)勢(shì)
線程的使用
方式一:直接實(shí)例化Thread類
from threading import Threaddef task():print("子線程 run")# 與進(jìn)程不同之處1 不需要加判斷 開啟線程的代碼放哪里都可以 t = Thread(target=task) t.start() print("over")方式二:繼承Thread類,覆蓋run方法
class MyThread(Thread):def run(self):# 把要在子線中執(zhí)行的代碼放入run中print("子 run")mt = MyThread() mt.start() print("over")線程安全問題
只要并發(fā)訪問了同一資源一定會(huì)產(chǎn)生安全問題,解決方案和多進(jìn)程一致,就是給操作公共資源代碼加鎖
from threading import Thread,Lock import time a = 10l = Lock()def task():global al.acquire()temp = atime.sleep(0.1)a = temp - 1l.release()ts = [] for i in range(10):t = Thread(target=task)t.start()ts.append(t)for t in ts:t.join()print(a)守護(hù)線程
一個(gè)線程a,設(shè)置為b的守護(hù)線程, a會(huì)隨著b的結(jié)束而結(jié)束
默認(rèn)情況下,主線程即使代碼執(zhí)行完畢,也會(huì)等待所有非守護(hù)線程完畢后程序才能結(jié)束 ,因?yàn)槎鄠€(gè)線程之間是協(xié)作關(guān)系
from threading import Thread import time# 妃子的一生 def task():print("妃子 start")time.sleep(5)print("妃子 over")def task2():print("皇太后 start")time.sleep(3)print("皇太后 over")# 皇帝的一生 print("主 start")t = Thread(target=task) # 守護(hù)線程,主線程結(jié)束就結(jié)束 t.daemon = True t.start()t2 = Thread(target=task2) # 非守護(hù)線程,主線程會(huì)等待非守護(hù)線程結(jié)束后再結(jié)束 t2.start() print("主 over")"""結(jié)果 主 start 妃子start 皇太后 start 主over 皇太后 over """線程中的常用屬性和方法
from threading import Thread,currentThread,enumerate,activeCount import time# t = Thread() # t.start() # t.join() # t.is_alive() # 判斷線程是否開啟 # t.isAlive() # 判斷線程是否開啟 # t.ident # 線程標(biāo)識(shí)符 id # t.daemon# 獲取當(dāng)前線程對(duì)象 # print(currentThread()) # t = Thread(target=lambda :print(currentThread())) # t.start()t = Thread(target=lambda :time.sleep(1)) t.start()t = Thread(target=lambda :time.sleep(1)) t.start() t.join() # 獲取正在運(yùn)行的所有線程對(duì)象 是一個(gè)列表 print(enumerate())# 存活的線程數(shù)量 print(activeCount())轉(zhuǎn)載于:https://www.cnblogs.com/Hades123/p/11153637.html
總結(jié)
- 上一篇: 从零单排之玩转Python安全编程(II
- 下一篇: 关于Xbox live及其在中国的使用