Python多线程学习教程
首先我們來解釋一下多線程:多線程我們可以理解為多個(gè)進(jìn)程/多個(gè)程序同時(shí)運(yùn)行,多線程最大的好處就是幫助我們提高效率,平常我們1小時(shí)完成的任務(wù),通過多線程10分鐘就可以完成,甚至更短,這個(gè)就取決于你的線程數(shù)啦。
多線程會(huì)給我們帶來什么:好處:它可以大大提高我們代碼處理數(shù)據(jù)的速度;缺點(diǎn):代碼的復(fù)雜度也將隨之提高,死鎖問題也將隨之產(chǎn)生。
我們?cè)撊绻胧侄嗑€程:先嘗試著成功運(yùn)行一份多線程代碼。然后再解讀這份代碼,依據(jù)自己現(xiàn)有的知識(shí)去理解這份代碼,遇到不懂的地方記下來,然后帶著這些疑問去看小編的教程你會(huì)發(fā)現(xiàn)事半功倍的。學(xué)完后記得自己寫幾個(gè)多線程加以訓(xùn)練。
這是小編為大家準(zhǔn)備的一份多線程示范代碼:
#!/usr/bin/python3import queue import threading import timeexitFlag = 0class myThread (threading.Thread):def __init__(self, threadID, name, q):threading.Thread.__init__(self)self.threadID = threadIDself.name = nameself.q = qdef run(self):print ("開啟線程:" + self.name)process_data(self.name, self.q)print ("退出線程:" + self.name)def process_data(threadName, q):while not exitFlag:queueLock.acquire()if not workQueue.empty():data = q.get()queueLock.release()print ("%s processing %s" % (threadName, data))else:queueLock.release()time.sleep(1)threadList = ["Thread-1", "Thread-2", "Thread-3"] nameList = ["One", "Two", "Three", "Four", "Five"] queueLock = threading.Lock() workQueue = queue.Queue(10) threads = [] threadID = 1# 創(chuàng)建新線程 for tName in threadList:thread = myThread(threadID, tName, workQueue)thread.start()threads.append(thread)threadID += 1# 填充隊(duì)列 queueLock.acquire() for word in nameList:workQueue.put(word) queueLock.release()# 等待隊(duì)列清空 while not workQueue.empty():pass# 通知線程是時(shí)候退出 exitFlag = 1# 等待所有線程完成 for t in threads:t.join() print ("退出主線程")運(yùn)行結(jié)果:
開啟線程: Thread-1 開啟線程: Thread-2 Thread-1: Wed Apr 6 11:52:57 2017 Thread-1: Wed Apr 6 11:52:58 2017 Thread-1: Wed Apr 6 11:52:59 2017 Thread-2: Wed Apr 6 11:53:01 2017 Thread-2: Wed Apr 6 11:53:03 2017 Thread-2: Wed Apr 6 11:53:05 2017 退出主線程?
一、使用Threading模板塊創(chuàng)建線程:
1,函數(shù)方法介紹:
- run():用以表示線程活動(dòng)的方法
- start():啟動(dòng)線程活動(dòng)
- join([time]):等待至線程中止。這阻塞調(diào)用線程直至線程的join() 方法被調(diào)用中止-正常退出或者拋出未處理的異常-或者是可選的超時(shí)發(fā)生。
- isAlive():檢查一個(gè)線程是否仍舊在進(jìn)行
- getName():返回一個(gè)線程的名字
- setName():設(shè)置一個(gè)線程的名字
2,要使用theading模板實(shí)現(xiàn)一個(gè)新線程,你要做的有:
定義Thread類的一個(gè)子類
????重寫__init__(self [,args])方法
????然后,重寫run(self [,args])方法
????在你創(chuàng)建新的Thread子類以后,你可以創(chuàng)建它的一個(gè)實(shí)例,然后引用start()來開啟一個(gè)新線程。
?
二、同步線程
如果多個(gè)線程共同對(duì)某個(gè)數(shù)據(jù)修改,則可能出現(xiàn)不可預(yù)料的結(jié)果,為了保證數(shù)據(jù)的正確性,需要對(duì)多個(gè)線程進(jìn)行同步。
引入“鎖”的概念,鎖的兩種狀態(tài)——鎖定和未鎖定
鎖定:鎖定部分代碼不能被其他程序運(yùn)行
未鎖定:多個(gè)線程可以同時(shí)運(yùn)行這部分
threadLock = threading.Lock() #獲取鎖,對(duì)下面代碼進(jìn)行鎖定,保持線程同步 threadLock.acquire() #釋放鎖,解除上方代碼的鎖定,讓其他進(jìn)程進(jìn)入 threadLock.release()?
三、多線程優(yōu)先級(jí)隊(duì)列:
Queue模塊允許你創(chuàng)建一個(gè)新的隊(duì)列對(duì)象,以盛放一定數(shù)量的項(xiàng)目
控制Queue有以下方法:
- get():從隊(duì)列移除一個(gè)項(xiàng)目并返回它
- put():把項(xiàng)目放入隊(duì)列
- qsize():返回當(dāng)前隊(duì)列中項(xiàng)目的數(shù)量
- empty():如果隊(duì)列為空,返回True,反之為False
- full():如果隊(duì)列滿了返回True,反之為False
?
總結(jié)
以上是生活随笔為你收集整理的Python多线程学习教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的微信公众号
- 下一篇: Python--状态码的简介与获取方法