python的多線程原來(lái)可以這樣解
多線程
多線程類(lèi)似于同時(shí)執(zhí)行多個(gè)不同程序,多線程運(yùn)行有如下優(yōu)點(diǎn):
使用線程可以把占據(jù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理。
用戶界面可以更加吸引人,比如用戶點(diǎn)擊了一個(gè)按鈕去觸發(fā)某些事件的處理,可以彈出一個(gè)進(jìn)度條來(lái)顯示處理的進(jìn)度。
程序的運(yùn)行速度可能加快。
在一些等待的任務(wù)實(shí)現(xiàn)上如用戶輸入、文件讀寫(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)文章
簡(jiǎn)介Django框架中可使用的各類(lèi)緩存
這篇文章主要介紹了簡(jiǎn)介Django框架中可使用的各類(lèi)緩存,Django是人氣最高的Python web開(kāi)發(fā)框架,需要的朋友可以參考下2015-07-07
Python利用matplotlib做圖中圖及次坐標(biāo)軸的實(shí)例
今天小編就為大家分享一篇Python利用matplotlib做圖中圖及次坐標(biāo)軸的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
python如何實(shí)現(xiàn)質(zhì)數(shù)求和
這篇文章主要介紹了python如何實(shí)現(xiàn)質(zhì)數(shù)求和,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
Python入門(mén)案例之找出文件中出現(xiàn)次數(shù)最多的10個(gè)單詞
這篇文章主要為大家?guī)?lái)一個(gè)簡(jiǎn)單的Python入門(mén)案例——找出文件中出現(xiàn)次數(shù)最多的10個(gè)單詞,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02
Python爬取豆瓣數(shù)據(jù)實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Python爬取豆瓣數(shù)據(jù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
Python標(biāo)準(zhǔn)庫(kù)itertools的使用方法
本文匯總整理了Python標(biāo)準(zhǔn)庫(kù)itertools的使用方法,并提供簡(jiǎn)單應(yīng)用示例;如果還不能滿足你的要求,歡迎加入補(bǔ)充2020-01-01

