Python多线程学习教程
首先我們來解釋一下多線程:多線程我們可以理解為多個進(jìn)程/多個程序同時運行,多線程最大的好處就是幫助我們提高效率,平常我們1小時完成的任務(wù),通過多線程10分鐘就可以完成,甚至更短,這個就取決于你的線程數(shù)啦。
多線程會給我們帶來什么:好處:它可以大大提高我們代碼處理數(shù)據(jù)的速度;缺點:代碼的復(fù)雜度也將隨之提高,死鎖問題也將隨之產(chǎn)生。
我們該如果入手多線程:先嘗試著成功運行一份多線程代碼。然后再解讀這份代碼,依據(jù)自己現(xiàn)有的知識去理解這份代碼,遇到不懂的地方記下來,然后帶著這些疑問去看小編的教程你會發(fā)現(xiàn)事半功倍的。學(xué)完后記得自己寫幾個多線程加以訓(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# 填充隊列 queueLock.acquire() for word in nameList:workQueue.put(word) queueLock.release()# 等待隊列清空 while not workQueue.empty():pass# 通知線程是時候退出 exitFlag = 1# 等待所有線程完成 for t in threads:t.join() print ("退出主線程")運行結(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():用以表示線程活動的方法
- start():啟動線程活動
- join([time]):等待至線程中止。這阻塞調(diào)用線程直至線程的join() 方法被調(diào)用中止-正常退出或者拋出未處理的異常-或者是可選的超時發(fā)生。
- isAlive():檢查一個線程是否仍舊在進(jìn)行
- getName():返回一個線程的名字
- setName():設(shè)置一個線程的名字
2,要使用theading模板實現(xiàn)一個新線程,你要做的有:
定義Thread類的一個子類
????重寫__init__(self [,args])方法
????然后,重寫run(self [,args])方法
????在你創(chuàng)建新的Thread子類以后,你可以創(chuàng)建它的一個實例,然后引用start()來開啟一個新線程。
?
二、同步線程
如果多個線程共同對某個數(shù)據(jù)修改,則可能出現(xiàn)不可預(yù)料的結(jié)果,為了保證數(shù)據(jù)的正確性,需要對多個線程進(jìn)行同步。
引入“鎖”的概念,鎖的兩種狀態(tài)——鎖定和未鎖定
鎖定:鎖定部分代碼不能被其他程序運行
未鎖定:多個線程可以同時運行這部分
threadLock = threading.Lock() #獲取鎖,對下面代碼進(jìn)行鎖定,保持線程同步 threadLock.acquire() #釋放鎖,解除上方代碼的鎖定,讓其他進(jìn)程進(jìn)入 threadLock.release()?
三、多線程優(yōu)先級隊列:
Queue模塊允許你創(chuàng)建一個新的隊列對象,以盛放一定數(shù)量的項目
控制Queue有以下方法:
- get():從隊列移除一個項目并返回它
- put():把項目放入隊列
- qsize():返回當(dāng)前隊列中項目的數(shù)量
- empty():如果隊列為空,返回True,反之為False
- full():如果隊列滿了返回True,反之為False
?
總結(jié)
以上是生活随笔為你收集整理的Python多线程学习教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的微信公众号
- 下一篇: pandas教程(一)Series与Da