2017-02-16 118 views
1

如何从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() 
+0

你的问题让我困惑。在这种情况下'__name__'是一种红鲱鱼。在函数'sub_process'中,你在一个子进程中。在这个函数之外,你在父进程中。你为什么不问你想达到什么? – RobertB

+0

@RobertB - 相应地编辑问题。 – kyrenia

+0

您可以将代码分隔成独立的功能,如“设置”。那么你在启动你的进程之前调用'module1.setup()'? – RobertB

回答

0

纠正我,如果我错了。根据我的理解,您想知道哪个进程(主进程或子进程)正在运行。你可以做到这一点使用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 
0

在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

相关问题