python多執行緒

2021-07-06 00:16:56 字數 2532 閱讀 2179

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分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...