正确终止流程

时间:2018-02-12 08:42:16

标签: python python-3.5 python-multiprocessing

我有一个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"退出处理程序和最后的子句等不会被执行"。如何正确终止进程并关闭它使用的内容?

1 个答案:

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