2012-04-02 84 views
0

我只知道多线程的基本概念,而我目前遇到需要一些帮助的情况。Python多线程:需要建议使用条件变量同步2个线程

我有两个任务要完成,并且都应该连续执行。事情是,第二个任务应该在第一个线程首先完成一些工作之后才开始。现在两个线程类看起来大致如下所示:

finished = False # shared flag 

class first(threading.Thread): 
    def __init__(self, cond, finished): 
     threading.Thread.__init__(self) 
     self.cond = cond 
     self.finished = finished 

    def run(self): 
     self.cond.aquire() 
     do_something() 
     self.finished = True #change the flag 
     self.cond.notify() 
     self.cond.release() 
     do_something_else() 


class second(threading.Thread): 
    def __init__(self, cond, finished): 
     threading.Thread.__init__(self) 
     self.cond = cond 
     self.finished = finished 

    def run(self): 
     self.cond.aquire() 
     while self.finished == False: 
      self.cond.wait() 
     self.cond.release() 
     do_something() 

然而,事实是,该程序仍执行随机不管等待的()和notify()。有人可以帮我解决这个问题吗?谢谢。

+0

请出示你如何在代码中使用这些类 – 2012-04-02 22:34:41

回答

3

class firstself.finished是全球finished的价值,而不是它的一个引用的副本,所以它具有的class secondself.finished没有活的关系。

您应该可能会创建一个全局的Queue对象(它旨在与threading模块配合使用)。让两个类都引用队列,并让第一个线程向队列写入超时信号,第二个线程阻塞,直到它读取超时。

+0

谢谢你的答案罗素! – 2012-04-03 01:30:44

1

您可以完全避免同步。使用3个线程而不是2.

线程1a'做了一些工作'并终止。 线程1b在1a结束时开始,并且 线程2独立启动。

(此外,我想你知道,你不能有效地与Python线程共享CPU;这些只是很好的I/O并行等着当你需要CPU密集型的并行化,使用multiprocessing。)