2016-07-29 70 views
0

平台:CentOS 6上的Python 2.6如何加速从notify_all等待唤醒?

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

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

我在拨打notify_all()之前拨打datetime.datetime.now(),并在wait()之后致电。两者之间的时间差异在9到45毫秒之间变化。这是永恒!

我试过了:我已经调用os.nice()来降低Thread1的优先级,希望它会强制立即切换上下文[我在线程1的threading.Thread() target中调用os.nice()]。没爱。拨打notify_all()后再加上time.sleep(0.001)也没有爱情。

我也应该注意到这是一个多进程应用程序,这两个线程在大约5个进程之一。我正在运行一个至强8核超线程和32 GB内存的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 
+0

这不是上下文切换时间。现在是第一个线程完成对象的时候了。锁的整点是防止两个线程同时访问线程。他们必须轮流。 –

回答

0

notify_all加速醒来,之后wait回报持有锁的时间更短。这是阻止其他线程进展的锁。

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

+0

我添加了2个函数调用中的代码。只要我'notify_all()'我放开了锁。 – PfunnyGuy

+0

@PfunnyGuy你误读了我。我说“在等待退回*之后,锁住更少的时间*”。 –

+0

我将再次阅读关于简历的内容。我认为一旦'wait()'返回,锁就会返回,因为它退出了'with'块。这将是我睡了一晚后的第一份工作。 – PfunnyGuy