我使用非阻塞UNIX UDP套接字将数据从一个进程传输到另一个进程:
audio_s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
audio_s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 5500000)
audio_s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 5500000)
audio_s.setblocking(0)
try:
os.remove(SOCKET_PATH)
except FileNotFoundError as e:
pass
audio_s.bind(SOCKET_PATH)
我经常将数据发送到远程进程:
audio_s.sendto(data, REMOTE_SOCKET_PATH)
但有时(非常罕见)我会在BlockingIOError: [Errno 11] Resource temporarily unavailable
来电时抓住sendto
。这可能是什么原因? Resource temporarily unavailable
看起来非常通用。
如果我删除行:
audio_s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 5500000)
没有此例外
答案 0 :(得分:0)
Errno 11是EAGAIN,来自'man sendto':
[EAGAIN]套接字被标记为非阻塞,请求的操作将被阻止。
有很好的解释: When a non-blocking send() only transfers partial data, can we assume it would return EWOULDBLOCK the next call? 那里: EAGAIN Error: Using Berkeley Socket API