0

Python multiprocessing を使用してテスト プログラムを作成しています。ロガーを使用して進行状況を記録しています。ただし、ロガーは機能していないようです。子プロセス内からはログまたは出力しません。何が問題なのかわかりません。ロガーを単純な print ステートメントに置き換えても役に立ちません。以下は私のコードです:

from multiprocessing import Pool
from multiprocessing.pool import ApplyResult
import time
import os
import logging
import multiprocessing
import sys

logger=[]
class C( object ):

    def __init__(self, a, b=1):
        self.a = a
        self.b = b        


    def f(self, name):
        global logger
        time.sleep(2) 
        logger.info('****Inside f..******')
        return str(os.getpid())                


    def call_back(self, x):
        print 'Inside callback', x



    def _run(self):
        print 'Reached inside run..'
        print 'main process id ..', os.getpid()
        pool = Pool(processes=6)
        names = ['frank', 'justin', 'osi', 'thomas', 'jim', 'rock', 'stonecold', 'machoman']        
        result = pool.map_async(unwrap_self_f, zip([self]*len(names), names), 1, callback=self.call_back)
        result.wait()
        print type(result)
        print result


    def hello(self):
        print 'Running hello....'
        self._run()

def test():
    logger.info( 'Starting....test')
    c = C(1, 2)
    print 'Running test....'
    c.hello()    

def unwrap_self_f(arg, **kwarg):
    print 'inside unwrap_self_f'
    return C.f(*arg, **kwarg)    

if __name__ == '__main__':
    print 'Loading multiprocessing...'
    logger = multiprocessing.log_to_stderr()
    logger.setLevel(logging.DEBUG)  
    test()

私が得る出力は以下の通りです:

Loading multiprocessing...
[INFO/MainProcess] Starting....test
Running test....
Running hello....
Reached inside run..
main process id .. 19056
[DEBUG/MainProcess] created semlock with handle 520
[DEBUG/MainProcess] created semlock with handle 532
<class 'multiprocessing.pool.MapResult'>
<multiprocessing.pool.MapResult object at 0x030FFB30>
[DEBUG/MainProcess] finalizing pool
[DEBUG/MainProcess] helping task handler/workers to finish
[DEBUG/MainProcess] task handler got sentinel
[DEBUG/MainProcess] removing tasks from inqueue until task handler finished
[DEBUG/MainProcess] task handler sending sentinel to result handler
[DEBUG/MainProcess] task handler sending sentinel to workers
[DEBUG/MainProcess] result handler got sentinel
[DEBUG/MainProcess] task handler exiting
[DEBUG/MainProcess] terminating workers
[DEBUG/MainProcess] ensuring that outqueue is not full
[DEBUG/MainProcess] joining task handler
[DEBUG/MainProcess] result handler exiting: len(cache)=0, thread._state=2
[DEBUG/MainProcess] joining result handler
[DEBUG/MainProcess] joining pool workers

"'****Inside f..******'" (関数 f 内から) はログに記録されません。マルチプロセッシングでのロギングは難しいようです:(私はPython 2.6.6を使用しています。OSはwindows-32bit/64bitです。

4

1 に答える 1

0

生成されたプロセスでは、ログが初期化されません。そのため、メイン プロセスだけでなくmultiprocessing.log_to_stderr、各プロセス ( など) のコードがアクセスする場所で呼び出す必要があります。unwrap_self_f例えば:

def unwrap_self_f(arg, **kwarg):
    global logger
    print 'inside unwrap_self_f'
    logger = multiprocessing.log_to_stderr()
    logger.setLevel(logging.DEBUG)
    return C.f(*arg, **kwarg)    
于 2014-12-03T10:33:35.710 に答える