자식 프로세스에서 보낸 메시지를 수신하는 Python 코드가 있습니다. 메시지는 콘솔 창에 직접 인쇄되는 일반 문자열이거나 프로그램의 다른 곳에서 처리되는 예외 객체 및 추적 출력이있는 튜플 일 수 있습니다. multiprocessing.Queue 구현은 프로세스 간 통신에 사용됩니다. 큐 객체는 self.channel에 의해 참조됩니다. msg를 터플 (자식 프로세스를 함유 에러 정보) 인python multiprocessing.Queue.get() 원하지 않는 순간에 아무 것도 출력하지 않습니다.
while self.exp_process.is_alive() or not self.channel.empty():
# Make sure Qt interface stays responsive, gets redrawn, etc.
QtGui.QApplication.processEvents()
# Check if messages are pending to be processed
# Sleep otherwise
if not self.channel.empty():
# Encapsulated by print statements for debugging of None print
print "Retrieving message"
msg = self.channel.get(False)
print "Message received"
# Directly print received strings
if type(msg) in [str, unicode]:
sys.stdout.write(msg)
# Errors arrive as a tuple with (Error object, traceback)
elif type(msg) == tuple and isinstance(msg[0], Exception):
return msg
else:
sys.stderr.write(u"Illegal message type received from child process")
else:
time.sleep(0.1)
,
msg = self.channel.get(False)
콘솔의 출력으로 없음을 인쇄하지 나타나는는
Retrieving message
None
Message received
인 그 후에, msg에 포함 된 튜플은 올바른 정보가 수신되었음을 나타내는대로 처리됩니다. Tuple을받을 때 Queue.get() 함수의 어딘가에 None이 인쇄 된 것 같습니다. 어쨌든 출력을 억제하거나 수정해야합니까?
이것은 속임수입니다. 감사합니다. 이 자원은 비싸지 않습니까? 최소한 StringIO 객체는 루프가 시작되기 전에 한 번 만들어지고 루프 내에서 참조되는 것입니다. Queue.get()이 파이썬 라이브러리에 심각한 버그를 인쇄하지 않는다는 사실입니까? 귀하의 솔루션은 간단하고 효과적이지만, 불필요한 추악한 해킹 인 것처럼 보입니다. –
위대한, 다행 당신을 위해 일했다. GUI 애플리케이션의 모습을 보면 시스템 리소스가 고갈되지 않는다고 추측 할 수 있습니다. 코드에서''time.sleep()' '을 사용하지 않는 방법을 찾는 것이 더 중요합니다.) 도서관의 심각한 버그? 아마. 내 해결책 해킹? 명확히. 추한? 당신은''다중 처리 (multiprocessing) ''모듈 C 코드를 디버깅하고 수정하는 것과 반대되는 것을 의미합니까? –
나는 잠시 동안 프로세스를 일시 중지하고 채널의 메시지를 지속적으로 확인하지 않도록 time.sleep을 사용했다.이 작업을 수행하는 올바른 방법이라고 생각했지만 틀릴 수도있다. 파이썬 C 코드를 디버깅하는 것은 사실 나를위한 선택 사항이 아니므로이 방법을 사용하면됩니다. 감사! –