我有一个类似Queue的类,我正在创建一个工作线程。该工作线程负责处理队列中的每个项目。
由于此类的实例应始终具有工作线程,因此我在init方法本身中创建并启动工作线程。
我想知道这样做是否是一种不好的做法。
e.g
class CustomQueue:
def __init__(self):
# some initialization
self.worker = threading.Thread(target=sometarget)
self.worker.start()
答案 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...