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