2017-02-16 3 views
1

現在のプロセスがインポートされたモジュール内から親プロセスか子プロセスかを判断するにはどうすればよいですか?現在のプロセスの実行が親プロセスかどうかを確認するにはどうすればよいですか?

具体的には、コードを最初に実行したとき(つまり、サブプロセスが開始されてからそのモジュールをインポートするまで)に実行する必要がある、インポートするモジュールにいくつかのコード行があります。

メインモジュールでは、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

"setup"のようなコードを別の関数に分けることができますか?次に、プロセスを起動する前に 'module1.setup()'を呼び出します。 – RobertB

答えて

0

は私を修正します。私の理解に基づいて、実行中のプロセス(メインプロセスまたはサブプロセス)を知りたいとします。 Linuxでの

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

プロセス0(スワッパ)を除くすべてのプロセスが片方の親があり、おそらく多くのチャイルズ(https://en.wikipedia.org/wiki/Parent_process)ので、あなた:あなたは%(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") 

出力を指定した形式で、loggingを使用してこれを達成することができますメインスレッドにも親があります

これは、プログラムを起動すると、すべての子プロセスの親(または祖父母など)であるため、osから割り当てられたPIDを保存する必要があるからです。あなたが使用して現在のプロセスのPIDを取得するには、os.getppid()を使用することができますチャイルズO 1にあるとき

import os 

parent_pid = os.getpid() 
print "[parent] starts PID: %d" % (parent_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

関連する問題