Python+;PyQt+;线程|从未调用析构函数,没有留下其他引用
在此伪代码中,从不调用Python+;PyQt+;线程|从未调用析构函数,没有留下其他引用,python,multithreading,garbage-collection,pyqt,Python,Multithreading,Garbage Collection,Pyqt,在此伪代码中,从不调用o的析构函数 class MyObj(): def __del__(): print "Destroyed!" do_upon_death() def parse(): o = MyObj() print "Ok so far..." raise Exception run_in_QThread(parse) do_other_things() 我看到终端上打印了异常,但是o似乎没有被垃圾收集。解释器在异常时不退出(主
o
的析构函数
class MyObj():
def __del__():
print "Destroyed!"
do_upon_death()
def parse():
o = MyObj()
print "Ok so far..."
raise Exception
run_in_QThread(parse)
do_other_things()
我看到终端上打印了异常,但是o
似乎没有被垃圾收集。解释器在异常时不退出(主线程保持运行)
这背后的全部目的是能够在异常发生时在析构函数中执行某些清理
另一种解释方法是使用不同的模式:
try:
run_in_thread(parse)
except:
print "Will I ever get printed?"
在parse
中发生的异常不会被捕获
更进一步地说:
with MyContextManager() as manager:
run_in_thread(lambda: do_something(manager))
这里是manager.\uuuu exit\uuuu()
将使用所有None
参数调用,就好像代码完全完成一样,即使中存在异常,也可以执行一些操作
这背后的目的是因为我运行的某些任务可能由于太多不同的原因而失败,这些任务可以部分在主线程中完成,部分在工作线程中完成。这两个方面都可能失败
因此,我最初的想法是在任务运行时保留对对象的引用,因此,如果任务通过退出上下文或异常完成,引用将丢失,最终将运行析构函数
我正试图跟踪这些任务,并在GUI上保留一个可视指示器,指示哪些任务仍在执行它们的工作。您可以在引发异常后捕获它并执行您想要执行的操作
try:
o = MyObj()
print "Ok so far..."
raise Exception
except Exception:
del o
或者,如果未提出例外情况,则使用该表格:
finaly:
del o
如果您只需要保持线程的活动状态,那么您应该使用:Thread.sleep()
据我所知,线程中只有parse(),所以您需要通过emit()创建关于删除的信号,并在主线程中发送它
我相信,使用析构函数并不是最好的决定,最好能捕捉到一些信号。请添加更多关于为什么要这么做的信息 请阅读文档。我阅读了文档。还有更深层次的想法吗?我只是补充了一些细节。谢谢