2017-02-16 70 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

相關問題