【问题标题】:how to extract the status of a subprocess如何提取子进程的状态
【发布时间】:2021-12-30 04:31:02
【问题描述】:

我的情况是这样的: 首先,我在保留主进程的同时打开了一个子进程,有点像subprocess = Process(target=func, name='MySubprocess')

当我在subprocess.start() 之前打印subprocess 时,我得到的信息显示如下:<Process(MySubprocess), initial>;
subrpocess.start() 之后,打印subprocess 我得到<Process(MySubprocess), started>; 在subrpocess.join() 之后,我得到了<Process(MySubprocess, stopped)>

所以我现在想知道如何提取initialstarted 甚至stopped。 我知道可以使用Subprocess.is_alive() 来确认子进程的活动状态,但是我可以提取像“初始”或“停止”这样的状态,然后我可以使用它来根据我的要求进行判断.

感谢您抽出宝贵时间审阅这个问题并给我答案。

【问题讨论】:

    标签: python multiprocessing subprocess


    【解决方案1】:

    当您打印subprocess 时,您将打印出multiprocessing.BaseProcess.__repr__ 方法返回的字符串。您要查找的状态似乎始终遵循父进程 ID。只要将来仍然如此,就可以使用正则表达式搜索来提取此状态:

    parent=\d+ (\w+)
    
    1. parent= - 匹配 'parent='。
    2. \d+ - 匹配一位或多位数字
    3. - 匹配单个空格
    4. (\w+) - 匹配捕获组 1 中的一个或多个“单词字符”。

    See Regex Demo

    from multiprocessing import Process
    import re
    
    
    def get_status(process):
        """
        Return the current status of the passed process instance as a string.
        """
    
        regex = r'parent=\d+ (\w+)'
        m = re.search(regex, process.__repr__())
        return m[1] if m else 'unknown'
    
    def worker():
        import time
        time.sleep(1)
    
    if __name__ == '__main__':
        p = Process(target=worker, name='my_process')
        print(get_status(p))
        p.start()
        print(get_status(p))
        p.join()
        print(get_status(p))
    

    打印:

    initial
    started
    stopped
    

    但请注意,这些描述可能会在未来的 Python 版本中发生变化。

    因此,您最好使用以下逻辑:

    from multiprocessing import Process
    
    
    def get_status(process):
        if process.is_alive():
            return 'started'
        # Either never started or has already terminated:
        return 'initial' if process.exitcode is None else 'stopped'
    
    def worker():
        import time
        time.sleep(1)
    
    if __name__ == '__main__':
        p = Process(target=worker, name='my_process')
        print(get_status(p))
        p.start()
        print(get_status(p))
        p.join()
        print(get_status(p))
    

    打印:

    initial
    started
    stopped
    

    【讨论】:

    • 感谢您的详细解答
    • What should I do when someone answers my question?。也就是说,如果这解决了您的问题,那么您应该接受答案,而不是感谢我。
    • 因为我是 stackoverflow 的新手,所以当我点击喜欢你的答案时,它会弹出一个通知,上面写着“感谢您的反馈!您需要至少 15 声望才能投票,但您的反馈已被记录。所以....
    • 要接受答案,请点击投票按钮下方的“复选标记”按钮。
    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多