如何加快从notify_all等待唤醒?

时间:2016-07-29 03:19:55

标签: python multithreading multiprocessing

平台:CentOS 6上的Python 2.6

我有2个线程使用同一个对象。线程1提供对象数据,当找到正确的数据时,它会执行threading.Condition.notify_all()

线程2通过对象在相同的条件变量上调用threading.Condition.wait()

我在datetime.datetime.now()电话之前和notify_all()电话之后抓住wait()。两者之间的时差在9到45毫秒之间变化。那是永恒的!

我尝试了什么:我调用os.nice()来降低Thread1的优先级,希望它会强制立即进行上下文切换[我在线程1的os.nice()内调用threading.Thread()目标]。没爱。在致电time.sleep(0.001)之后添加notify_all()也没有爱。

我还应该注意这是一个多进程应用程序,这两个线程在大约5个进程之一。我正在运行一个带有8个超线程内核和32 GB RAM的Xeon。所以处理器管道应该非常出色。

连连呢?我需要问的问题我可能还没问过自己吗?我期待一些上下文切换时间,但45毫秒似乎绝对荒谬。这真的是一种永恒。

编辑:使用条件变量的代码。

def ProcessEvent( self, event ):
    with self.__conditionVar:
        if self.__testEvent( event ):
            self.__notifyTime = datetime.now()
            self.__conditionVar.notify_all()

def WaitForEvent( self, timeout_sec ):
    with self.__conditionVar:
        if not self.__alreadyFound():
            self.__conditionVar.wait( timeout_sec )
            delta = datetime.now() - self.__notifyTime
            print "Wake-up time =", delta

1 个答案:

答案 0 :(得分:0)

要加快从notify_all的唤醒速度,请在wait返回后保持锁定的时间更短。这是阻止其他线程取得进展的锁。

如果这不能明显解决您的问题,那么您很可能会滥用条件。如果是这样,请解释您使用条件的原因。