如何确定当前运行的进程是否为父进程?
问题描述:
如何从Python中的多处理模块中确定当前进程是父进程还是子进程?如何确定当前运行的进程是否为父进程?
具体来说,我在导入的模块中有一些代码行,只需要运行一次 - 当代码第一次运行时(即不会运行子进程启动的时间,并导入该模块)。
在主模块中,我能够使用if __name__ == '__main__':
来实现此目的,但是这在导入的模块中不起作用。
在相关的,当前的代码情况包括:
import multiprocessing as mp
pool = mp.Pool(processes=7, maxtasksperchild=1)
all_items = [pool.apply_async(sub_process, args=(value,) for value in all_values]
for item in all_items:
item.get()
答
纠正我,如果我错了。根据我的理解,您想知道哪个进程(主进程或子进程)正在运行。你可以做到这一点使用logging
,格式指定%(processName)s %(threadName)s
import multiprocessing
import logging
import sys
logger = logging.getLogger("mylogger")
formatter = logging.Formatter('%(processName)s %(threadName)s [%(levelname)s] %(message)s')
handler = logging.StreamHandler(stream=sys.stdout)
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
def f(x):
logger.info(multiprocessing.current_process())
return x * x
if __name__ == "__main__":
logger.info("get started")
p = multiprocessing.Pool()
p.map(f, range(6))
logger.info("done")
输出:
MainProcess MainThread [INFO] get started
ForkPoolWorker-1 MainThread [INFO] <ForkProcess(ForkPoolWorker-1, started daemon)>
ForkPoolWorker-2 MainThread [INFO] <ForkProcess(ForkPoolWorker-2, started daemon)>
ForkPoolWorker-3 MainThread [INFO] <ForkProcess(ForkPoolWorker-3, started daemon)>
ForkPoolWorker-1 MainThread [INFO] <ForkProcess(ForkPoolWorker-1, started daemon)>
ForkPoolWorker-4 MainThread [INFO] <ForkProcess(ForkPoolWorker-4, started daemon)>
ForkPoolWorker-2 MainThread [INFO] <ForkProcess(ForkPoolWorker-2, started daemon)>
MainProcess MainThread [INFO] done
答
在linux除进程0(交换技术),每个进程都有一个父,可能很多孩子的(https://en.wikipedia.org/wiki/Parent_process),所以您的主线程也有一个父项
这就是为什么你,如果你开始你的程序,必须存储从os分配给它的PID,因为它是所有子进程的父级(或祖父级,...) 。
import os
parent_pid = os.getpid()
print "[parent] starts PID: %d" % (parent_pid,)
得到父进程,当你在一个O孩子的,你可以使用os.getppid()
,得到当前进程的PID使用os.getpid()
from multiprocessing import Process
import os
def info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid())
https://docs.python.org/3/library/multiprocessing.html
https://docs.python.org/2/library/os.html
http://www.programcreek.com/python/example/4464/os.getppid http://nullege.com/codes/search/os.getppid
你的问题让我困惑。在这种情况下'__name__'是一种红鲱鱼。在函数'sub_process'中,你在一个子进程中。在这个函数之外,你在父进程中。你为什么不问你想达到什么? – RobertB
@RobertB - 相应地编辑问题。 – kyrenia
您可以将代码分隔成独立的功能,如“设置”。那么你在启动你的进程之前调用'module1.setup()'? – RobertB