읽기 전용 명명 된 파이프가 있고 출력이 사용 가능할 때까지 차단하고 싶습니다 (소켓에 select
과 동일한 동작).pywin32 파이프가 비어있을 때 WaitForMultipleObjects가 차단되지 않습니다.
사용 가능한 출력이 없을 경우 WaitForMultipleObjects
을 차단한다고 가정했지만 그렇지는 않습니다. 출력이 가능할 때까지 효율적으로 대기하기 위해 할 수있는 일은 무엇입니까? 은 모든 반복에서 읽을 수있는 0 바이트를 반환하지만 아래 코드에서 루프는 100 번 실행됩니다.
import win32security, win32file, win32pipe, win32event, win32con
pipeName = r"\\.\pipe\test-pipe"
saAttr = win32security.SECURITY_ATTRIBUTES()
namedPipe = win32pipe.CreateNamedPipe(
pipeName,
win32con.PIPE_ACCESS_DUPLEX | win32con.FILE_FLAG_OVERLAPPED, # open mode
win32con.PIPE_TYPE_BYTE, # pipe mode
1, # max instances
1, # out buffer size
1, # in buffer size
0, # timeout
saAttr)
fileHandle = win32file.CreateFile(pipeName,
win32file.GENERIC_READ,
0, None,
win32file.OPEN_EXISTING,
0, None)
for i in range(100):
# would expect this to block until data is available
ret = win32event.WaitForMultipleObjects([fileHandle], 0, win32event.INFINITE)
print(i, ret)
size = 1
buffer, bytesToRead, result = win32pipe.PeekNamedPipe(namedPipe, size)
print(buffer, bytesToRead, result)
if bytesToRead > 0:
res = win32file.ReadFile(namedPipe, size)