Python中的非阻塞类(分离线程)

3
我想在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"实例能作为一个独立线程运行(与主线程分离)。在这个例子中,当主线程到达sample.test()时,只有"sample"会睡眠2秒钟。同时,主线程将继续执行并将sample的状态设置为0。2秒钟后,"sample"醒来后会看到状态=0并退出while循环。
问题是如果我这样做,那么就永远无法到达sample.setStatus(0)这一行 (创建了一个无限循环)。我已经为线程命名,结果发现通过这样做,test()被主线程运行。
我想我对Python的线程处理还没有完全理解...
提前感谢您的帮助。
2个回答

4
对象的run()方法是在一个单独的线程中执行的。当您调用sample.test()时,它会在主线程中执行,因此您会得到无限循环。

哦,糟糕...我明白了...那我必须改变我的思考方式...谢谢! - Savir

2
也许是这样吧?
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

我猜那可能可行,但我想要更加“优雅”的东西……我想我得大幅度改变结构。谢谢! - Savir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接