线程锁问题python屏障模式?

时间:2013-09-05 18:28:06

标签: python multithreading

我有这个

#threads 
import thread
import threading
import time

class ThreadTask(threading.Thread):
    def __init__(self,name,delay,callback):

        threading.Thread.__init__(self)

        self.name = name
        self.counter = 0
        self.delay = delay
        self.callback = callback
        self.lock = threading.Lock()

    def run(self):
        while True:
            self.counter += 1
            print 'running ', self.name , self.counter
            time.sleep(self.delay)

            if self.counter % 5 == 0:
                self.callback(self)


class Barrier(object):
    def __init__(self):
        self.locks = []

    def wait_task(self,task):
        print 'lock acquire'
        self.locks.append(task.lock)
        task.lock.acquire(True)
        task.lock.acquire(True)


    def notity_task(self,task):
        print 'release lock'
        for i in self.locks: 
            try:
                i.release()
            except Exception, e:
                print 'Error', e.message

            print 'Lock released'

       self.locks = []


try:
    barrier = Barrier()

    task1 = ThreadTask('Task_1',1,barrier.wait_task)
    task4 = ThreadTask('Task_4',1,barrier.wait_task)
    task3 = ThreadTask('Task_3',2,barrier.wait_task)
    task2 = ThreadTask('Task_2',3,barrier.notity_task)

    task2.start()
    task1.start()
    task3.start()
    task4.start()

except Exception as e:
    raise e

while 1:
    pass

这些线程运行正常,但是如果我连续2个task.lock.acquire(True),否则不起作用,当需要每个10时,它们会停止每个10个。任何人都知道发生了什么?

由于

1 个答案:

答案 0 :(得分:0)

您可以在此处创建常规的非重入式锁定:

    self.lock = threading.Lock()

然后尝试两次获取它

    task.lock.acquire(True)
    task.lock.acquire(True)

这是非法的,常规锁定不能被同一个线程获取两次。

也许您的意思是使用threading.RLock()