在init方法中启动一个线程是个坏主意吗?

时间:2017-06-08 02:41:32

标签: python

我有一个类似Queue的类,我正在创建一个工作线程。该工作线程负责处理队列中的每个项目。

由于此类的实例应始终具有工作线程,因此我在init方法本身中创建并启动工作线程。

我想知道这样做是否是一种不好的做法。

e.g

class CustomQueue:

    def __init__(self):
        # some initialization
        self.worker = threading.Thread(target=sometarget)
        self.worker.start()

2 个答案:

答案 0 :(得分:0)

没关系,但您需要添加一个__del__方法来停止线程,以便在CustomQueue对象消失后线程不会挂起。当CustomQueue实例被垃圾收集时,将调用此__del__方法。

答案 1 :(得分:0)

我不知道我是否会把它称为不好的做法,但我的 第一直觉是避免构造函数中的所有副作用: 不要与DB交谈,不要与文件系统交互,不要做 Web请求,而且,不,不要启动进程或线程。只要有可能, 对象实例化应该是一种廉价,轻量级的操作

这个一般规则在测试时特别有用 和调试。例如,想象一下这种情况:

class CustomQueue:

    def __init__(self):
        # Side effects here...

    def fubb(self, x, y):
        ...

如果您想要单元测试fubb(),或者可能在Python中与它进行交互 REPL,考虑所有这些副作用是相当烦人的。

大多数规则都有例外,如果它真的有意义的话 这个类立即采取行动,一个解决方法是添加一个 可选参数,以支持您的测试/调试用例。例如:

class CustomQueue:

    def __init__(self, lightweight = False):
        if not lightweight:
            # Side effects here...