python的多線程原來(lái)可以這樣解
多線程
多線程類(lèi)似于同時(shí)執(zhí)行多個(gè)不同程序,多線程運(yùn)行有如下優(yōu)點(diǎn):
使用線程可以把占據(jù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理。
用戶(hù)界面可以更加吸引人,比如用戶(hù)點(diǎn)擊了一個(gè)按鈕去觸發(fā)某些事件的處理,可以彈出一個(gè)進(jìn)度條來(lái)顯示處理的進(jìn)度。
程序的運(yùn)行速度可能加快。
在一些等待的任務(wù)實(shí)現(xiàn)上如用戶(hù)輸入、文件讀寫(xiě)和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下我們可以釋放一些珍貴的資源如內(nèi)存占用等等。
創(chuàng)建線程
一個(gè)進(jìn)程里面必然有一個(gè)主線程。
創(chuàng)建線程的兩種方法 繼承Thread類(lèi),并重寫(xiě)它的run()方法 import threading import time cLass MyThread(threading.Thread): def__ init__ (seLf, n): super (MyThread, seLf).__ init__() self.n = n def run(self): print('以類(lèi)的方式創(chuàng)建多線程',self.n) time.sleep(3) r1 = MyThread(1) r2 = MyThread(2) r1.start() r2.start() 調(diào)用threading庫(kù)的Thread類(lèi) import threading import time def test(x): print(x) time.sleep(2) if __name__=='__main__': t1 = threading.Thread(target=test, args=(1,)) t2 = threading.Thread(target=test, args=(2,)) t1.start() t2.start()
守護(hù)線程此類(lèi)線程的特點(diǎn)是,當(dāng)程序中主線程及所有非守護(hù)線程執(zhí)行結(jié)束時(shí),未執(zhí)行完畢的守護(hù)線程也會(huì)隨之消亡(進(jìn)行死亡狀態(tài)),程序?qū)⒔Y(jié)束運(yùn)行。
#守護(hù)線程 import threading import time def run(n): print('task',n) time.sleep(1) print('3s') time.sleep(1) print('2s') time.sleep(1) print('1s') if __name__ == '__main__': #主線程 t=threading.Thread(target=run,args=('t1',)) t.setDaemon(True) #設(shè)置子線程為守護(hù)線程,守護(hù)主線程。主線程結(jié)束,子線程也立馬結(jié)束。必須在start() 方法調(diào)用之前設(shè)置 t.start() print('end')
線程鎖
1.互斥鎖 #互斥鎖 import threading def run(): global x lock.acquire() #申請(qǐng)鎖 x+=1 lock.release() #釋放鎖 if __name__=='__main__': x=0 res=[] lock=threading.Lock() #實(shí)例化線程鎖 for i in range(100): #100個(gè)線程 t=threading.Thread(target=run) t.start() res.append(t) for t in res: t.join() print(x) 2.遞歸鎖 import threading def func(lock): global gl_num lock.acquire() gl_num += 1 time.sleep(1) print(gl_num) lock.release() if __name__ == '__main__': gl_num = 0 lock = threading.RLock() for i in range(10): t = threading.Thread(target=func,args=(lock,)) t.start()
練手:
import threading import time #導(dǎo)入時(shí)間模塊 #線程一:輸出當(dāng)前的年月日時(shí)分秒 class myThread1(threading.Thread): def run(self): while (True): print(time.asctime(time.localtime(time.time())))#輸出實(shí)時(shí)時(shí)間 time.sleep(1) #線程二:name每2秒打印輸出4次結(jié)束 class myThread2(threading.Thread):#繼承threading.Thread def __init__(self,name):#繼承父類(lèi)的方法實(shí)現(xiàn)繼承threading.Thread super(myThread2, self).__init__()#super方法調(diào)用父類(lèi) self.name=name #實(shí)例化對(duì)象屬性 def run(self):#重寫(xiě)Thread類(lèi)中的run方法 for i in range(4):#for循環(huán)打印4次 print(self.name) time.sleep(2)#打印一次delay兩秒 if __name__ == '__main__': #創(chuàng)建線程1和線程2并傳入?yún)?shù) x1 = myThread1() x2 = myThread2("張三") #開(kāi)啟線程 x1.start() x2.start()
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python語(yǔ)法def語(yǔ)句及復(fù)雜用法實(shí)例探究
在 Python 中,def?是用于定義函數(shù)的關(guān)鍵字,本文將深入介紹def的用法和特點(diǎn),詳細(xì)說(shuō)明如何定義函數(shù)、傳遞參數(shù)、返回值以及更復(fù)雜的用法2024-01-01淺談openpyxl庫(kù),遇到批量合并單元格的問(wèn)題
這篇文章主要介紹了淺談openpyxl庫(kù),遇到批量合并單元格的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03完美解決Python matplotlib繪圖時(shí)漢字顯示不正常的問(wèn)題
今天小編就為大家分享一篇完美解決Python matplotlib繪圖時(shí)漢字顯示不正常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Keras目標(biāo)檢測(cè)mtcnn?facenet搭建人臉識(shí)別平臺(tái)
這篇文章主要為大家介紹了Keras目標(biāo)檢測(cè)mtcnn?facenet搭建人臉識(shí)別平臺(tái),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05淺談python類(lèi)屬性的訪問(wèn)、設(shè)置和刪除方法
下面小編就為大家?guī)?lái)一篇淺談python類(lèi)屬性的訪問(wèn)、設(shè)置和刪除方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07