我正在编写一个具有许多功能的类(因此是方法),但是我要求这个类在一个线程内运行(类打开一个子进程)。我想使用声明基于线程的类的常用方法,
class HiStackOverflow(threading.Thread):
# Somethings...
然而,正如我所说,我的这类有许多伪私有,常规和静态方法。当我声明它们时,我想避免错误地覆盖一些必要的threading.Thread
方法。
好吧,我总是可以检查threading.Thread
的目录,看看是否有任何重叠的方法名称,但这似乎是一种不恰当的方法来处理这个问题。随着方法计数的增加,这可能是不切实际的。
我的问题是,这种实施是否可行?如果没有,我应该如何处理?我应该写一些包装类作为Thread处理程序。
提前致谢。
答案 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)
这句话中似乎有一些想法混淆:
但是我要求这个类在一个线程内运行(类打开一个子进程)
类不会“运行”。您可以启动一个执行某些类方法或实例方法的新线程。该类不必从Thread
继承。它甚至不需要对正在运行的线程的引用。你刚开始在一个新线程中执行一些功能,你就完成了。
子进程与线程无关。你不需要做另一个。
如果您担心覆盖某些内容,请查看文档(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):
...