【发布时间】:2016-11-08 09:32:06
【问题描述】:
我正在创建一个套接字并使用它与 python 进程通信。
我这样创建套接字是因为我已经有一个文件描述符:
sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
如果我收到大量请求,它将引发 [Errno 11] 资源暂时不可用。
当消息不适合套接字的发送缓冲区时, send() 通常会阻塞,除非套接字已被放置在 非阻塞 I/O 模式。在非阻塞模式下,它会因错误而失败 在这种情况下,EAGAIN 或 EWOULDBLOCK。 select(2) 调用可用于 确定何时可以发送更多数据。
然后看起来它处于非阻塞 I/O 模式并且引发 EAGAIN 错误。
所以我把它设置为阻塞:
sock.setblocking(1)
但我一直有同样的错误。 socket.fromfd 文档还说:
假定套接字处于阻塞模式
【问题讨论】:
-
当你说“它会引发......”你的意思是你从
socket.fromfd电话中得到了那个例外吗? -
我有另一种方法,它通过包含在尝试中的套接字发送数据,除了 OSError,e: 引发 Errno 11。
-
AFAIK,如果 (a) 套接字设置为非阻塞,或者 (b) 设置了超时,您应该只在
send调用中获得EAGAIN(errno 11)setsockopt(..., SO_SNDTIMEO, ...) -
这就是我的想法,但正如您所见,我将其设置为非阻塞并且我没有使用任何超时...