我有一个multiprocessing.Process
的子类,我想正确终止它。
class MyProcess(Process):
def __init__(self, target, input_queue, output_queue, database):
super().__init__()
self.input_queue = input_queue
self.output_queue = output_queue
self.target = target
self.database = database
self.db_session = database.create_session()
# ...
def run(self):
signal.signal(signal.SIGINT, signal.SIG_IGN)
while True:
try:
# doing some stuff here
except Empty:
break
except Exception as err:
logger.error(str(err))
try:
self.db_session.commit()
except:
logger.error(str(err))
我希望在进程终止时关闭self.db_session
(这是一个SQLAlchemy会话)。但是因为Python documentation says"退出处理程序和最后的子句等不会被执行"。如何正确终止进程并关闭它使用的内容?
答案 0 :(得分:0)
我使用multiprocessing.Event()
找到了一个很好的解决方案。我在Event
类的构造函数中添加了一个MyProcess
对象,过程循环现在看起来像这样:
def run(self):
while True:
try:
if self.stop_event.is_set():
break # breaks the loop if a stop event is set
# doing some stuff here
except Empty:
break
except Exception:
logger.error(str(err))
try:
self.db_session.commit()
except:
logger.error(str(err))
我只需要调用terminate()
,而不是在需要终止我的进程时调用stop_event.set()
,这将打破循环并优雅地关闭所有内容。