2017-12-25 10 views
0

여러 개의 print() 인디케이터가있는 일부 작업에 멀티 프로세싱을 사용하므로 cmd에서 프로세스가 시작/작동/종료 된 방법을 알 수 있습니다. 그러나 일부 작업은 더 빠르거나 느리므로 print() 순서는 혼란 스럽습니다. 과정이 끝나면 즉시 모든 print()을 보여주는 방법을 찾아야합니다.다중 처리의 모든 print() 버퍼링 방법. 내부 및 외부 함수 처리?

간체 예 : 지금이 코드를 실행하면

from multiprocessing import Process 
from time import sleep 


def runner(px_id): 
    print('Start'+str(px_id)) 

    if px_id > 1: 
     sleep(2) 
    elif px_id == 1: 
     sleep(5) 

    print('Middle'+str(px_id)) 

    if px_id > 1: 
     sleep(2) 
    elif px_id == 1: 
     sleep(5) 

    print('End'+str(px_id)) 


if __name__ == '__main__': 
    px_list = [1, 2, 3] 

    for px in px_list: 
     p = Process(target=runner, args=(px,)) 
     p.start() 

, 내가 받게됩니다 :

Start2 
Middle2 
End2 
Start3 
Middle3 
End3 
Start1 
Middle1 
End1 

나는 여전히 프로세스가 필요합니다

Start1 
Start2 
Start3 
Middle2 
Middle3 
End2 
End3 
Middle1 
End1 

내가 좋아하는 뭔가가 필요하지만 비동기 (따라서 join()을 사용할 수는 없음)이지만 프로세스가 끝나면 모든 print()를 인쇄하십시오. 조언을 주셔서 감사합니다 :

UPD : 기능 메시지를 버퍼링하기위한 배열을 사용하는 것은 좋은 해결책이지만 여전히 외부 기능의 버퍼링 솔루션에 대한 도움이 필요합니다. 내 말은, 다른 함수 안에 일부 함수를 사용하면 모든 print()을 수동으로 버퍼링 할 수 없으므로 좀 더 복잡한 솔루션을 찾을 수 있습니다. :)

답변

1

하나의 옵션은 각 인스턴스 버퍼의 출력을 내부 버퍼에 저장하는 것입니다. 끝에서 출력하십시오. 메인 쓰레드를 가져 와서 시작된 각 프로세스를 배열에 저장할 수 있습니다. 세 가지 모두를 끝내고 어레이의 각 프로세스에서 내부 버퍼를 가져 와서 순차적으로 인쇄하십시오.

+0

'while while'루프 내에 프로세스가 생성되면 내부 버퍼가 작동합니까? 문자열 변수에 '\ n +'를 추가하고 끝에 큰 문자열을 인쇄 할 수는 있지만 부 자연스럽게 보입니다. – sortas

+0

다시 읽으십시오. 배열 아이디어가 완벽한 솔루션처럼 보입니다. – sortas

+0

아직도 내부 기능은 어떻습니까? 내 말은, 배열 내부에 함수 메시지를 버퍼링 할 수 있지만 내부에 일부 외부 함수를 사용하면 외부 프린트를 버퍼링 할 수 없다는 것입니다. 어쩌면 좀 더 복잡한 해결책이 있을까요? :) – sortas

관련 문제