우선, 누군가가 여기서 도울 수 있다면, 당신은 믿을 수 없습니다.
일반적인 질문
내 파이썬 프로그램은 MSMQ와 상호 작용해야합니다. 기본적으로 대기열에 아무것도없는 경우 시간 초과를 지정하여 대기열을 들여다보고 싶습니다.
그러나 최선의 노력에도 불구하고 이전에 대기열에 값이 없으면 Peek ()가 시간 초과 간격을 기다리도록 할 수 없습니다. 이 코드에서 무엇이 빠졌는지 알려 주시겠습니까?
내 현재 코드
여기 내 코드가 있습니다 :
from socket import gethostname
import win32com.client
import pythoncom
import clr
clr.AddReference("System")
clr.AddReference("System.Messaging")
from System import TimeSpan
from System.Messaging import MessageQueue
# Source: [1]
# [1] https://docs.microsoft.com/en-us/previous-versions/windows/desktop/msmq/ms707027%28v%3dvs.85%29
MQ_DENY_NONE = 0x0
MQ_PEEK_ACCESS = 0x1
MQ_SEND_ACCESS = 0x2
# Set up queue
pythoncom.CoInitialize()
qinfo = win32com.client.Dispatch("MSMQ.MSMQQueueInfo")
qinfo.FormatName = f"direct=os:{gethostname()}\\PRIVATE$\\MyQueue"
queue = qinfo.Open(MQ_PEEK_ACCESS, MQ_DENY_NONE)
# Receive a value
timeout_sec = 1.0
timespan = TimeSpan.FromSeconds(timeout_sec)
label, body = "", ""
# TODO: timeout value does not appear working. It never waits when
# there's no message
if queue.Peek(pythoncom.Empty, pythoncom.Empty, timespan):
msg = queue.Receive() . # Blocking receive --> remove msg from the queue
if msg is not None:
label = msg.Label
body = msg.Body
나는 실행 inspect.getfullargspec(queue.Peek)
하고 얻는다 :
FullArgSpec(args=['self', 'WantDestinationQueue', 'WantBody', 'ReceiveTimeout', 'WantConnectorType'], varargs=None, varkw=None, defaults=(<PyOleMissing object at 0x00000147F5D43BD0>, <PyOleMissing object at 0x00000147F5D43BD0>, <PyOleMissing object at 0x00000147F5D43BD0>, <PyOleMissing object at 0x00000147F5D43BD0>), kwonlyargs=[], kwonlydefaults=None, annotations={})
내가 시도한 것들
이 질문 : 말하는 ReceiveTimeout=timespan
것이 내 문제를 해결하지 못하는 것 같습니다.
교체 pythoncom.Empty
로하는 것은 pythoncom.Missing
작동하지 않는 것
이 답변되지 않은 질문 은 내 것과 매우 유사 해 보입니다.
queue.Peek
CoWaitForMultipleHandles(Flags, Timeout , Handles )
도움이 되셨 습니까?