正确终止进程

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(),这将打破循环并优雅地关闭所有内容。