python的多執行緒寫起來還算是容易的,宣告乙個類,繼承threading.thread並實現run函式就好了
#coding = utf-8
'''created on 2015-10-20
@author: kwsy2015
'''import threading
import time
class threadworker(threading.thread):
def __init__(self,workcount,sleeptime):
self.workcount = workcount
threading.thread.__init__(self)
self.sleeptime = sleeptime
def run(self):
for i in range(self.workcount):
print 'thread %s finish %d' % (self.name,i)
time.sleep(self.sleeptime)
if __name__=='__main__':
tw = threadworker(10,0.5)
tw.start()
tw2 = threadworker(8,0.8)
tw2.start()
tw.join()
tw2.join()
print 'ok'
使用join函式,可確保兩個執行緒都結束後再執行print 'ok『
執行緒之間會為了爭奪同乙個資源而產生競爭,可以使用lock來實現互斥,先看乙個沒有互斥的例子
#coding = utf-8
'''created on 2015-10-20
@author: kwsy2015
'''import threading
import time
class threadworker(threading.thread):
def __init__(self,workcount):
self.workcount = workcount
threading.thread.__init__(self)
def run(self):
global counter
for i in range(self.workcount):
counter +=1
if __name__=='__main__':
counter = 0
tw = threadworker(2000)
tw.start()
tw2 = threadworker(2000)
tw2.start()
tw.join()
tw2.join()
print counter
最終的列印結果會小於4000,這是因為執行一次加1操作並不是我們所以為的那樣簡單,真實的過程是,從記憶體中讀取counter的值寫入到暫存器,在暫存器裡執行加1,寫會記憶體。由於是多執行緒,所以可能第乙個執行緒剛剛把值寫入到暫存器,第二個執行緒就開始執行加1操作了,也從記憶體讀取數值寫入暫存器,這樣一來,原本應該增加2,最後卻只增加了1,最後給出加鎖的示例
#coding = utf-8
'''created on 2015-10-20
@author: kwsy2015
'''import threading
import time
lock = threading.rlock()
class threadworker(threading.thread):
def __init__(self,workcount):
self.workcount = workcount
threading.thread.__init__(self)
def run(self):
global counter
for i in range(self.workcount):
with lock:
counter +=1
if __name__=='__main__':
counter = 0
tw = threadworker(2000)
tw.start()
tw2 = threadworker(2000)
tw2.start()
tw.join()
tw2.join()
print counter
需要注意的是,由於python的全域性直譯器鎖的存在,使得python的多執行緒不能有效的利用多核,同乙個時間內,只有乙個執行緒獲得了全域性直譯器鎖,因此,對於cpu密集型的操作,就不要用多執行緒了,因為執行緒間的上下文切換反而會浪費效能,如果是i/0密集型的,例如網路爬蟲,用多執行緒還是可以的,因為有相當一部分時間是在等待網路返回來的資料。大家普遍認為多執行緒很雞肋,除了全域性直譯器鎖這個因素外,python還提供了同樣好用的多程序multiprocessing
python多執行緒 python多執行緒
通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...
python多執行緒詳解 Python多執行緒詳解
前言 由於最近的工作中一直需要用到python去處理資料,而在面對大量的資料時,python多執行緒的優勢就展現出來了。因而藉此機會,盡可能詳盡地來闡述python多執行緒。但對於其更底層的實現機制,在此不做深究,僅是對於之前的一知半解做個補充,也希望初學者能夠通過這篇文章,即便是照葫蘆畫瓢,也能夠...
python程式多執行緒 PYTHON多執行緒
在單執行緒的情況下,程式是逐條指令順序執行的。同一時間只做乙個任務,完成了乙個任務再進行下乙個任務。比如有5個人吃飯,單執行緒一次只允許乙個人吃,乙個人吃完了另乙個人才能接著吃,假如每個人吃飯都需要1分鐘,5個人就需要5分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...