Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python+;PyQt+;线程|从未调用析构函数,没有留下其他引用_Python_Multithreading_Garbage Collection_Pyqt - Fatal编程技术网

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()创建关于删除的信号,并在主线程中发送它


我相信,使用析构函数并不是最好的决定,最好能捕捉到一些信号。请添加更多关于为什么要这么做的信息

请阅读文档。我阅读了文档。还有更深层次的想法吗?我只是补充了一些细节。谢谢