python 2中的Lock对象是否有时间?

时间:2014-08-05 13:00:54

标签: python multithreading

我在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

但是当我尝试使用更大的numbler时。例如,我传递10000.它打印出意外的输出。

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

我尝试了很多次,但没有任何改变。所以我认为python中的Lock对象有超时。如果Lock获取很长时间,它将允许其他线程可以去。任何人都可以解释一下。谢谢!

2 个答案:

答案 0 :(得分:3)

不,锁没有超时。发生的事情是它们实际上并没有共享相同的锁,因为每次在 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()

这样,该类的两个实例共享相同的锁。

答案 1 :(得分:2)

每个线程都有自己的锁,因此获取t1的锁并不会阻止t2获取自己的锁。

也许你可以使lock成为一个类属性,因此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