【问题标题】:How to inherit a thread class with infinite loop如何继承具有无限循环的线程类
【发布时间】:2014-09-18 02:24:00
【问题描述】:

好的,假设我有一个继承 Thread 的工作类:

from threading import Thread
import time    

class DoStuffClass(Thread):

    def __init__(self, queue):
        self. queue = queue
        self.isstart = False

    def startthread(self, isstart):
        self.isstart = isstart
        if isstart:
            Thread.__init__(self)
        else:
            print 'Thread not started!'

    def run(self):
        while self.isstart:
            time.sleep(1)
            if self.queue.full():
                y = self.queue.get()    #y goes nowhere, it's just to free up the queue
            self.queue.put('stream data')

我已经尝试在另一个文件中调用它并且它工作成功:

from Queue import Queue
import dostuff

q = Queue(maxsize=1)
letsdostuff= dostuff.DoStuffClass()

letsdostuff.startthread(True)

letsdostuff.start()
val = ''
i=0
while (True):
    val = q.get()
    print "Outputting: %s" % val

现在,我可以通过队列获取类输出的值。

我的问题:假设我想创建另一个继承 DoStuffClass 的类(ProcessStuff),以便我可以通过队列对象(或任何其他方法)获取 DoStuffClass 的输出,处理它,并将其传递给 ProcessStuff 的队列,所以调用 ProcessStuff 的代码可以通过排队获得它的值。我该怎么做?

【问题讨论】:

  • 另外,请参阅this comment 我提出的另一个关于多线程的问题。如果您的线程正在执行 CPU 密集型操作,您最好使用 multiprocessing 模块而不是 threading

标签: python multithreading inheritance


【解决方案1】:

听起来您并不真的希望ProcessStuff 继承自DoStuffClass,而是希望ProcessStuff 在内部使用DoStuffClass 队列。因此,与其使用继承,不如让ProcessStuff 在内部保留对DoStuffClass 实例的引用,以及内部Queue 对象来获取DoStuffClass 产生的值:

class ProcessStuff(Thread):
    def __init__(self, queue):
        super(ProcessStuff, self).__init__()
        self.queue = queue
        self._do_queue = Queue()  # internal Queue for DoStuffClass
        self._do_stuff = dostuff.DoStuffClass(self._do_queue)

    def run(self):
        self._do_stuff.startthread(True)
        self._do_stuff.start()
        while True:
            val = self._do_queue.get()  # Grab value from DoStuffClass
            # process it
            processed_val = "processed {}".format(val)
            self.queue.put(processed_val)

q = Queue(maxsize=1)
letsprocessstuff = ProcessStuff(q)

letsprocessstuff.start()
while (True):
    val = q.get()
    print "Outputting: %s" % val

输出:

Outputting: processed stream data
Outputting: processed stream data
Outputting: processed stream data
Outputting: processed stream data

【讨论】:

  • 谢谢!这正是我所需要的——要求时找不到确切的词!我看到它使用 super() - 如果我用 Thread.__init__(self) 替换它,它也可以正常工作。
猜你喜欢
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多