2010-10-14 55 views
2

我想在python中创建一种非阻塞类,但我不知道如何。Python中的非阻塞类(分离线程)

我想要一个类是一个线程本身,从主线程分离,以便其他线程可以与它交互。

在一个小例子:

#!/usr/bin/python2.4 

import threading 
import time 

class Sample(threading.Thread): 
    def __init__(self): 
     super(Sample, self).__init__() 
     self.status = 1 
     self.stop = False 

    def run(self): 
     while not(self.stop): 
      pass 

    def getStatus(self): 
     return self.status 

    def setStatus(self, status): 
     self.status = status 

    def test(self): 
     while self.status != 0: 
      time.sleep(2) 

#main 
sample = Sample() 
sample.start() 
sample.test() 
sample.setStatus(0) 
sample.stop() 

我想是有“样品”实例运行作为一个单独的线程(从主一个分离),因此,在该示例中,当主线程达到sample.test(),样本(只有“样本”)会进入睡眠2秒。与此同时,主线程将继续执行并将样本的状态设置为0.当“样本”醒来2秒后,它会看到状态= 0并退出while循环。

问题是,如果我这样做,行sample.setStatus(0)永远不会到达(创建一个无限循环)。我已经命名了这些线程,事实证明,通过这样做,test()由主线程运行。

我想我没有得到线程在python那么好......

预先感谢您

回答

4

对象的run()方法是在单独的线程中执行的。当你调用在主线程中执行的sample.test(),所以你得到你的无限循环。

+0

哦,嘘** ...我看...然后我必须改变我的想法......谢谢! – BorrajaX 2010-10-14 16:37:37

1

也许这样的事情?

import threading 
import time 

class Sample(threading.Thread): 
    def __init__(self): 
     super(Sample, self).__init__() 
     self.stop = False 

    def run(self): 
     while not(self.stop): 
      print('hi') 
      time.sleep(.1) 

    def test(self): 
     print('testing...') 
     time.sleep(2) 

#main 
sample = Sample() 
sample.start()  # Initiates second thread which calls sample.run() 
sample.test()  # Main thread calls sample.test 
sample.stop=True # Main thread sets sample.stop 
sample.join()  # Main thread waits for second thread to finish 
+0

我想这可能会奏效,但我想要更优雅的东西......我想我必须改变结构......很多。 谢谢! – BorrajaX 2010-10-14 16:38:38