如何提取子流程的状态
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)>
.
所以我现在想知道如何提取 initial
、started
甚至 stopped
。
我知道可以使用 Subprocess.is_alive()
来确认子进程的活动状态,但是如果我可以提取 'initial' 或 'stopped' 之类的状态会很好,然后我可以使用它按照我的要求做出判断。
感谢您花时间查看这个问题并给我答案。
当您打印 subprocess
时,您正在打印出 multiprocessing.BaseProcess.__repr__
方法返回的字符串。您正在寻找的状态似乎总是遵循父进程 ID。只要将来仍然如此,就可以使用正则表达式搜索来提取此状态:
parent=\d+ (\w+)
parent=
- 匹配 'parent='.
\d+
- 匹配一位或多位数字
- 匹配单个 space
(\w+)
- 匹配捕获组 1 中的一个或多个“单词字符”。
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
我的情况是这样的:
首先,我在保留主进程的同时打开了一个子进程,有点像 subprocess = Process(target=func, name='MySubprocess')
当我在 subprocess.start()
之前打印 subprocess
时,我得到的信息显示如下:<Process(MySubprocess), initial>
;
在 subrpocess.start()
之后,打印 subprocess
我得到了 <Process(MySubprocess), started>
;
在 subrpocess.join()
之后,我得到了 <Process(MySubprocess, stopped)>
.
所以我现在想知道如何提取 initial
、started
甚至 stopped
。
我知道可以使用 Subprocess.is_alive()
来确认子进程的活动状态,但是如果我可以提取 'initial' 或 'stopped' 之类的状态会很好,然后我可以使用它按照我的要求做出判断。
感谢您花时间查看这个问题并给我答案。
当您打印 subprocess
时,您正在打印出 multiprocessing.BaseProcess.__repr__
方法返回的字符串。您正在寻找的状态似乎总是遵循父进程 ID。只要将来仍然如此,就可以使用正则表达式搜索来提取此状态:
parent=\d+ (\w+)
parent=
- 匹配 'parent='.\d+
- 匹配一位或多位数字(\w+)
- 匹配捕获组 1 中的一个或多个“单词字符”。
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