从threading.Thread继承自定义类

时间:2017-05-10 04:02:47

标签: python multithreading python-2.7

我正在编写一个具有许多功能的类(因此是方法),但是我要求这个类在一个线程内运行(类打开一个子进程)。我想使用声明基于线程的类的常用方法,

class HiStackOverflow(threading.Thread):
     # Somethings...

然而,正如我所说,我的这类有许多伪私有,常规和静态方法。当我声明它们时,我想避免错误地覆盖一些必要的threading.Thread方法。

好吧,我总是可以检查threading.Thread的目录,看看是否有任何重叠的方法名称,但这似乎是一种不恰当的方法来处理这个问题。随着方法计数的增加,这可能是不切实际的。

我的问题是,这种实施是否可行?如果没有,我应该如何处理?我应该写一些包装类作为Thread处理程序。

提前致谢。

3 个答案:

答案 0 :(得分:1)

如果您担心类和threading.Thread之间的命名空间冲突,我肯定会建议您使用合成而不是继承(或者将这两个功能完全分开)。仅仅包装你需要的几个线程方法不应该是一个重大的开销,然后将冲突命名为无问题。

它也更干净地将您的类的功能与线程提供的功能分开。从长远来看,这对于理解您的代码来说可能是一次胜利。

答案 1 :(得分:0)

继承Thread并没有多大好处。您可以使用工厂方法创建线程,甚至让__init__执行此操作。

import threading
import time

class MyClass:

    def __init__(self):
        self._thread = threading.Thread(target=self.run)
        self._thread.start()

    def run(self):
        for i in range(5):
            print('worker thread', i)
            time.sleep(.5)

    def join(self):
        self._thread.join()

my_obj = MyClass()
for i in range(3):
    print('main thread', i)
    time.sleep(.5)
my_obj.join()
print('done')

答案 2 :(得分:0)

这句话中似乎有一些想法混淆:

  

但是我要求这个类在一个线程内运行(类打开一个子进程)

  1. 类不会“运行”。您可以启动一个执行某些类方法或实例方法的新线程。该类不必从Thread继承。它甚至不需要对正在运行的线程的引用。你刚开始在一个新线程中执行一些功能,你就完成了。

  2. 子进程与线程无关。你不需要做另一个。

  3. 如果您担心覆盖某些内容,请查看文档(https://docs.python.org/3/library/threading.html#thread-objects)。否则,如果你想保留对线程的引用,你总是可以这样做:

    class HiStackoverflow:
        def run(self):
            self.thread = Thread(target=self.entry_point)
            self.thread.start()
    
        def entry_point(self):
            ...