簡體   English   中英

python 2中的Lock對象是否超時?

[英]Does Lock object in python 2 have time out?

我正在學習python中的多線程。 我寫一些代碼來練習

import threading
import time

Total = 0
class myThead(threading.Thread):

    def __init__(self, num):
        threading.Thread.__init__(self)
        self.num = num
        self.lock = threading.Lock()
    def run(self):
        global Total
        self.lock.acquire()
        print "%s acquired" % threading.currentThread().getName()
        for i in range(self.num):
            Total += 1
        print Total
        print "%s released" % threading.currentThread().getName()
        self.lock.release()

t1 = myThead(100)
t2 = myThead(100)
t1.start()
t2.start()

如果我將100傳遞給線程t1和t2,它們將正確運行。

Thread-1 acquired
100
Thread-1 released
Thread-2 acquired
200
Thread-2 released

但是當我嘗試使用更大的酒杯時。 例如,我通過10000。它將打印出意外的輸出。

Thread-1 acquired
Thread-2 acquired
14854
Thread-1 released
15009
Thread-2 released

我嘗試了很多次,但是沒有任何變化。 所以我認為python中的Lock對象有超時。 如果Lock長時間獲取,它將允許其他線程進入。 誰能向我解釋一下。 謝謝!

不,鎖沒有超時。 發生的情況是,它們實際上沒有共享同一鎖,因為每次在init方法中實例化對象時都會創建一個新鎖。 如果該類的所有實例將始終共享相同的鎖,則可以將其作為類屬性放入。 但是,顯式勝於隱式。 我個人會將鎖作為init方法的參數。 這樣的事情。

import threading
import time

Total = 0
class myThead(threading.Thread):

    def __init__(self, num, lock):
        threading.Thread.__init__(self)
        self.num = num
        self.lock = lock


    def run(self):
        global Total
        self.lock.acquire()
        print "%s acquired" % threading.currentThread().getName()
        for i in range(self.num):
            Total += 1
        print Total
        print "%s released" % threading.currentThread().getName()
        self.lock.release()

threadLock = threading.Lock()
t1 = myThead(100, threadLock)
t2 = myThead(100, threadLock)
t1.start()
t2.start()

這樣,該類的兩個實例共享相同的鎖。

每個線程都有自己的鎖,因此獲取t1的鎖不會阻止t2獲得自己的鎖。

也許您可以將lock myThread類屬性,以便myThread所有實例共享一個。

class myThead(threading.Thread):
    lock = threading.Lock()

    def __init__(self, num):
        threading.Thread.__init__(self)
        self.num = num

結果:

Thread-1 acquired
10000
Thread-1 released
Thread-2 acquired
20000
Thread-2 released

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM