【问题标题】:Non-blocking class in python (detached Thread)python中的非阻塞类(分离线程)
【发布时间】:2010-10-14 15:53:54
【问题描述】:

我正在尝试在 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(并且只有“sample ") 将进入睡眠状态 2 秒。与此同时,主线程将继续执行并将样本的状态设置为 0。当 2 秒后“样本”唤醒时,它会看到状态=0 并退出 while 循环。

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

我想我在 python 中的线程没有那么好......

提前谢谢你

【问题讨论】:

    标签: python multithreading nonblocking


    【解决方案1】:

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

    【讨论】:

    • 哦,嘘……我明白了……那我得换个思路了……谢谢!
    【解决方案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
    

    【讨论】:

    • 我想这可能行得通,但我想要一些更“优雅”的东西......我想我必须改变结构......很多。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多