正确终止进程
Properly terminate a process
我有一个 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"exit handlers and finally clauses, etc., will not be executed"。如何正确终止进程并关闭它使用的东西?
我找到了一个很好的解决方案,使用 multiprocessing.Event()
。我在 MyProcess
class 的构造函数中添加了一个 Event
对象,现在流程循环看起来像这样:
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()
,这将打破循环并优雅地关闭所有内容。
我有一个 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"exit handlers and finally clauses, etc., will not be executed"。如何正确终止进程并关闭它使用的东西?
我找到了一个很好的解决方案,使用 multiprocessing.Event()
。我在 MyProcess
class 的构造函数中添加了一个 Event
对象,现在流程循环看起来像这样:
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()
,这将打破循环并优雅地关闭所有内容。