如何提取子流程的状态

how to extract the status of a subprocess

我的情况是这样的: 首先,我在保留主进程的同时打开了一个子进程,有点像 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() 来确认子进程的活动状态,但是如果我可以提取 'initial' 或 'stopped' 之类的状态会很好,然后我可以使用它按照我的要求做出判断。

感谢您花时间查看这个问题并给我答案。

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

parent=\d+ (\w+)
  1. parent= - 匹配 'parent='.
  2. \d+ - 匹配一位或多位数字
  3. - 匹配单个 space
  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