2013-12-09 4 views
0

내 처리 프로세스와 내 데몬 프로세스간에 통신하는 데 Multiprocessing.Queue를 사용하고 있습니다. 데몬은 대기열에서 출력을 가져 와서 무한 루프의 파일에 씁니다. 파일 객체는 데몬 프로세스 printToFile 자체에서 열립니다.python 데몬 프로세스가 파일에 쓰지 않습니다.

resultqueue = Queue() 
p = Process(target = printToFile , args=(resultqueue)) 
p.daemon = True 
p.start() 


for si, ei in ranges: 
    pr = Process(target = processing , args=(si, ei, resultqueue)) 
    pr.start() 
    processes.append(pr) 

for pr in processes: 
    pr.join() 

내 문제는 PrintToFile이, 그것은 화면에 출력에도 불구하고,이 큐에서 얻는 출력을 파일에 아무것도 기록하지 않는다는 것입니다. 내가 줄을 제거하고, 데몬 프로세스로 설정하고, Ctrl + C를 사용하여 수동으로 프로그램을 종료하면 모든 것이 잘 동작합니다. 누군가가 내가 무슨 일이 일어나고 있는지 이해할 수있게 도와 줄 수 있습니까? 디버깅을 시작할 위치를 모르겠습니다.

프로그램이 실행을 끝내면 데몬이 종료되므로 fileObject.close()를 사용하지 않습니다. 하지만 프로세스 데몬을 만들지 않고 Ctrl + C를 사용하면 프로그램이 파일에 쓰기 때문에 문제는 아니라고 생각합니다. 또 다른 (아마도 관련이없는) 문제는 파일 객체가 printToFile 내에서 인스턴스화되지 않았지만 전역 인 경우에도 Ctrl + C를 사용하여 출력을 파일로 인쇄하지 않는다는 것입니다. 그러나 나는 그걸로 살 수있다. 그러나 나는 아직도 무슨 일이 일어나고 있는지 알고 싶다.

+1

'open' 함수의 세 번째 매개 변수로 '0'을 사용하여 파일 열기를 시도하십시오. – Deck

+0

실행 가능한 완전한 예제를 제공 할 수 있습니까? 지침은 [SSCCE] (http://sscce.org)를 참조하십시오. 마치 우리가 코드를 보여주지 않은 함수 안에 코드를 디버깅 해달라고 요청한 것처럼 보입니다. – abarnert

+0

덕분에 @Deck, 그게 내가 그것에 대해 몰랐다는 것을 믿을 수 없다. – rohanag

답변

3

내 의견이 성공적 이었기 때문에 나는 내가 말한 것을 지적했다. open() 함수 번째 인수되었습니다 - buffering :

선택적 버퍼링 인수는 파일의 원하는 버퍼 사이즈 지정 : 1 라인 버퍼를 의미하고, 0은 버퍼링 수단을 다른 긍정적 값 (약)의 버퍼를 사용하는 것을 의미 크기 (바이트). A 음의 버퍼링은 시스템 기본값을 사용하는 것을 의미합니다. 일반적으로은 tty 장치 용으로 버퍼링되고 다른 파일 용 버퍼링은입니다. 생략하면 시스템 기본값 인이 사용됩니다.

세 번째 인수로 0을 전달하면 파일이 버퍼링되지 않은 모드로 열리 며 변경 사항이 즉시 나타납니다.

관련 문제