我有只读的命名管道,并且想阻塞直到有可用的输出(与select
套接字上的行为相同)。
我假设WaitForMultipleObjects
如果没有可用的输出会阻塞,但事实并非如此。为了有效地等待输出可用,可以做些什么?
在下面的代码中,循环执行了 100 次,尽管PeekNamedPipe
每次迭代都返回 0 个字节可供读取。
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)