2016-07-15 5 views
0

私は次のようにLoggerクラスを持っている:子プロセスがキューにstdoutを渡すにはどうしたらいいですか? Pythonの

class Logger(): 
    def __init__(self): 
     self.terminal = sys.__stdout___ 
     self.log = open('logFile.log', 'w') 
    def write(message): 
     self.terminal.write(message) 
     self.log.write(message) 

次メイン:File1の中

import Logger, sys 
sys.stdout = Logger.Logger() 
import File1 
File1.aFunc() 

:File2の中

def execSubProc(target,queue): 
    target(queue) 

q = multiprocess.Queue() 
proc = multiprocess.Process(target=execSubProc, args=(testFunc,q)) 
proc.start() 
proc.join() 

def testFunc(queue) 
#Some print statements 
#I want to get these print statements in the queue for main process to read 

さて、ここに私の構造があります。私がやろうとしているのは、testFunc()を実行している子プロセスからstdoutを取得し、それをキューに入れることです。プログラムがmainに戻ると、私はキューから読み込み、その内容をログファイルに書きたいと思う。

sys.stdout = Logger.Logger()をファイル2にもう一度実行することはできません。これは、mainsログファイルを上書きするだけだからです。 stdoutのすべての子プロセスをキャプチャしてキューに入れるにはどうすればよいですか?

答えて

1

1つの解決方法は、loggingモジュールを使用することです。
ロガーはmultiprocessing.utilにdisponibleで、スレッドセーフログを生成するために使用することができます:プロセスの起動と停止からログを避けるために

import time 
import logging 
import multiprocessing as mp 
import multiprocessing.util as util 
from sys import stdout as out 


def runner(ids): 
    log = util.get_logger() 
    for i in range(10): 
     time.sleep(.5) 
     log.log(25, 'Process {} logging {}'.format(ids, i)) 

if __name__ == '__main__': 
    # Setup the logger 
    log = util.get_logger() 
    log.getEffectiveLevel() 
    # You can setup a file instead of stdout in the StreamHandler 
    ch = logging.StreamHandler(out) 
    ch.setLevel(25) 
    ch.setFormatter(logging.Formatter('%(processName)s - %(message)s')) 
    log.addHandler(ch) 
    log.setLevel(25) 

    p1 = mp.Process(target=runner, args=(1,), name="Process1") 
    p2 = mp.Process(target=runner, args=(2,), name="Process2") 

    p1.start() 
    p2.start() 

    time.sleep(2) 
    log.log(25, 'Some main process logging meanwhile') 

    p1.join() 

レベル> 20社の許可を。
引数outが書き込み可能なオープンファイルの場合、Handlerはファイルに直接ログインできます。
これにより、自分自身でログキューを処理する必要がなくなります。 loggingモジュールには他にも多くの高度な機能があります。

スレッドセーフログを取得するには、multiprocessingモジュールのロガーを使用することが重要です。

関連する問題