2012-04-05 2 views
2

최근 멀티 프로세싱을 우리 소프트웨어에 적용하는 문제가있었습니다. 메인 프로세스가 서브 프로세스를 생성하기를 원합니다. 메인 프로세스로 로깅 정보를 다시 보낼 방법이 필요합니다. 이는 주로 우리가 사용하는 모듈이 경고 및 오류 메시지를 로깅 객체에 기록하기 때문에 이러한 메시지가 주 프로세스에서 실행되는 gui에 나타나기를 원합니다.Python 3 : 로깅을 위해 다중 처리 대기열 사용

명백한 방법은 대기열에 puts() 메서드를 사용하여 작은 클래스를 작성한 다음이 클래스를 로깅 스트림 처리기에서 사용하는 것입니다. 메인 프로세스는이 대기열에서 gui로 텍스트를 보내 게됩니다. 하지만이 작동하지 않는 것, 그리고 왜 모르겠어요

문제를 보여주기 위해 몇 가지 샘플 코드를 썼습니다. 로깅 개체를 사용하여 하위 프로세스에 큐를 쓰고 주 프로세스가 큐에서 읽으려고 시도하지만 실패합니다. 누군가 내가이 문제가 무엇인지 알아낼 수 있습니까? 로깅 아무튼

Put: 1333629221.01 
Put: 1333629222.02 
Put: 1333629223.02 
Put: 1333629224.02 
Put: 1333629225.02 

그래서 넣어() FUNC의 동작은() 작동하지만 :

Logging: 1333629221.01 
Put: 1333629221.01 
Logging: 1333629222.02 
Put: 1333629222.02 
Logging: 1333629223.02 
Put: 1333629223.02 
Logging: 1333629224.02 
Put: 1333629224.02 
Logging: 1333629225.02 
Put: 1333629225.02 

하지만 내가 얻을 것은 :

import time, multiprocessing, queue, logging 

class FileLikeQueue: 
    """A file-like object that writes to a queue""" 
    def __init__(self, q): 
     self.q = q 
    def write(self, t): 
     self.q.put(t) 
    def flush(self): 
     pass 


def func(q): 
    """This function just writes the time every second for five 
    seconds and then returns. The time is sent to the queue and 
    to a logging object""" 

    stream = FileLikeQueue(q) 

    log = logging.getLogger() 
    infohandler = logging.StreamHandler(stream) 
    infohandler.setLevel(logging.INFO) 
    infoformatter = logging.Formatter("%(message)s") 
    infohandler.setFormatter(infoformatter) 
    log.addHandler(infohandler) 

    t1 = time.time() 
    while time.time() - t1 < 5: #run for five seconds 
     log.info('Logging: ' + str(time.time())) 
     q.put('Put: %s' % str(time.time())) 
     time.sleep(1) 



def main(): 
    q = multiprocessing.Queue() 
    p = multiprocessing.Process(target=func, args=(q,)) 
    p.start() 

    #read the queue until it is empty 
    while True: 
     try: 
      t = q.get() 
     except queue.Empty: 
      break 
     print(t) 


if __name__ == '__main__': 
    main() 

나는 출력이 될 것으로 기대 '티. 왜?

감사합니다.

+1

코드를 파고 들지는 않았지만 멀티 프로세싱 환경에 로그인하려고하면 [이 답변] (http://stackoverflow.com/a/9823098/1132524)을 찾을 수 있습니다. 오래 전, 유용했습니다. –

+0

이 Rik을 이용해 주셔서 감사합니다. –

답변

3

귀하의 문제는 로깅 모듈의 구성입니다 :

당신은 log.setLevel(logging.INFO)를 호출해야합니다. 기본 로그 레벨은 WARNING이므로 로그가 적용되지 않습니다.

처리기 개체에서 setLevel을 호출했지만 기록 된 메시지는 로거에 의해 필터링되므로 처리기에 도달하지 않습니다. 기본적으로 모든 메시지를 처리하므로 처리기 자체에서 setLevel으로 전화 할 필요가 없습니다.

+0

당신이 정확합니다! 전에는 보지 못해 미안해. –

관련 문제