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