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

4 投票
2 回答
13313 浏览
提问于 2025-04-16 05:29

我正在尝试在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。当“sample”在2秒后醒来时,它会看到状态是0,然后退出循环。

问题是,如果我这样做,sample.setStatus(0)这一行代码永远不会被执行(导致无限循环)。我给线程命名后发现,test()实际上是由主线程运行的。

我想我对Python中的线程理解得不太好……

谢谢你们的帮助!

2 个回答

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
4

这个对象的 run() 方法是在一个单独的线程中执行的。当你调用 sample.test() 时,它是在主线程中运行的,所以你会看到无限循环的情况。

撰写回答