我想在对象破坏之前做一些清理操作。在这种情况下,它将关闭与数据库的连接。
以下是我一直在做的事情:
工人阶级:
from PyQt5 import QtCore
from pymongo import MongoClient, ASCENDING
from time import sleep
class StatusWidgetWorker(QtCore.QObject):
ongoing_conversions_transmit = QtCore.pyqtSignal([list])
def __init__(self, mongo_settings):
super().__init__()
print("StatusWidget Worker init")
mongo_client = MongoClient([mongo_settings["server_address"]])
self.log_database = mongo_client[mongo_settings["database"]]
self.ongoing_conversions = mongo_settings["ongoing_conversions"]
def status_retriever(self):
print("mongo bridge()")
while True:
ongoing_conversions_list = []
for doc in self.log_database[self.ongoing_conversions].find({}, {'_id': False}).sort([("start_date", ASCENDING)]):
ongoing_conversions_list.append(doc)
self.ongoing_conversions_transmit.emit(ongoing_conversions_list)
sleep(2)
从另一个类调用worker的函数:
def status_worker(self):
mongo_settings = "dict parameter"
self.worker_thread_status = QtCore.QThread()
self.worker_object_status = StatusWidgetWorker(mongo_settings)
self.worker_object_status.moveToThread(self.worker_thread_status)
self.worker_thread_status.started.connect(self.worker_object_status.status_retriever)
self.worker_object_status.ongoing_conversions_transmit.connect(self.status_table_auto_updater)
self.worker_thread_status.start()
这是我已经尝试过的:
__del__
function,永远不会调用此函数。self.destroyed.connect(self.function)
将其连接到已销毁的信号。永远不会调用此函数。我认为这是因为当对象已被破坏时,而不是在破坏之前发出信号。我真的很想知道如何做到这一点,这里有一些答案:
http://www.riverbankcomputing.com/pipermail/pyqt/2014-November/035049.html
他的做法对我来说似乎有些苛刻(对作者没有冒犯,可能没有简单的答案)而且我有信号&传递给worker的参数会使ThreadController类变得更加混乱。
我觉得这个解决方案有点hacky因为你必须设置一个Controller类来完成Worker类的工作
如果没有人有答案,我可能会使用ThreadController类并在此处发布结果。
感谢您阅读: - )
答案 0 :(得分:0)
python中的通常规则适用:
有一个模块
解决方案是使用atexit模块并在__init__
函数中注册清理函数。
示例:
import atexit
class StatusWidgetWorker(QObject):
def __init__(self):
super().__init__()
# code here
atexit.register(self.cleanup)
def cleanup(self):
print("Doing some long cleanup")
sleep(2)
self.bla = "Done !"
print(self.bla)