我的情况如下:首先,我打开了一个子流程,同时保留了一个主流程,就像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()
来确认子进程的活动状态是可能的,但如果我可以提取一个像"初始"或"停止"这样的状态,那么我就可以根据我的要求使用它来做出判断,这将是一件好事。
谢谢你花时间复习这个问题并给我答案。
打印subprocess
时,打印出的是multiprocessing.BaseProcess.__repr__
方法返回的字符串。您要查找的状态似乎总是遵循父进程id。只要将来仍然如此,就可以使用正则表达式搜索来提取此状态:
parent=d+ (w+)
parent=
-匹配'parent='d+
-匹配一个或多个数字-匹配单个空间
- CCD_ 19-匹配一个或多个";单词字符";在捕获组1中
请参阅Regex演示
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