新聞中心
python中如何實現(xiàn)線程同步?所謂的線程同步機制其實就是鎖的使用,下面為大家詳細講解一下python中實現(xiàn)線程同步具體方法。

在溫州等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網(wǎng)站設計制作、成都網(wǎng)站建設 網(wǎng)站設計制作按需求定制網(wǎng)站,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站制作,成都全網(wǎng)營銷,外貿營銷網(wǎng)站建設,溫州網(wǎng)站建設費用合理。
使用 Thread 對象的 Lock 和 Rlock 可以實現(xiàn)簡單的線程同步,這兩個對象都有 acquire 方法和 release 方法,對于那些需要每次只允許一個線程操作的數(shù)據(jù),可以將其操作放到 acquire 和 release 方法之間。如下:
多線程的優(yōu)勢在于可以同時運行多個任務(至少感覺起來是這樣)。但是當線程需要共享數(shù)據(jù)時,可能存在數(shù)據(jù)不同步的問題。
考慮這樣一種情況:一個列表里所有元素都是0,線程”set”從后向前把所有元素改成1,而線程”print”負責從前往后讀取列表并打印。
那么,可能線程”set”開始改的時候,線程”print”便來打印列表了,輸出就成了一半0一半1,這就是數(shù)據(jù)的不同步。為了避免這種情況,引入了鎖的概念。
鎖有兩種狀態(tài)——鎖定和未鎖定。每當一個線程比如”set”要訪問共享數(shù)據(jù)時,必須先獲得鎖定;如果已經(jīng)有別的線程比如”print”獲得鎖定了,那么就讓線程”set”暫停,也就是同步阻塞;等到線程”print”訪問完畢,釋放鎖以后,再讓線程”set”繼續(xù)。
經(jīng)過這樣的處理,打印列表時要么全部輸出0,要么全部輸出1,不會再出現(xiàn)一半0一半1的尷尬場面。
實例:
#!/usr/bin/python3
import threading
import time
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("開啟線程: " + self.name)
# 獲取鎖,用于線程同步
threadLock.acquire()
print_time(self.name, self.counter, 3)
# 釋放鎖,開啟下一個線程
threadLock.release()
def print_time(threadName, delay, counter):
while counter:
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1
threadLock = threading.Lock()
threads = []
# 創(chuàng)建新線程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# 開啟新線程
thread1.start()
thread2.start()
# 添加線程到線程列表
threads.append(thread1)
threads.append(thread2)
# 等待所有線程完成
for t in threads:
t.join()
print ("退出主線程")
執(zhí)行以上程序,輸出結果為:
開啟線程: Thread-1
開啟線程: Thread-2
Thread-1: Wed Apr 6 11:52:57 2016
Thread-1: Wed Apr 6 11:52:58 2016
Thread-1: Wed Apr 6 11:52:59 2016
Thread-2: Wed Apr 6 11:53:01 2016
Thread-2: Wed Apr 6 11:53:03 2016
Thread-2: Wed Apr 6 11:53:05 2016
退出主線程
當前名稱:Python中實現(xiàn)線程同步
網(wǎng)頁鏈接:http://www.5511xx.com/article/dhdcpgs.html


咨詢
建站咨詢
