【问题标题】:socket set blocking raising OSError: [Errno 11] Resource temporarily unavailable套接字设置阻塞引发 OSError:[Errno 11] 资源暂时不可用
【发布时间】: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, ...)
  • 这就是我的想法,但正如您所见,我将其设置为非阻塞并且我没有使用任何超时...

标签: python sockets unix


【解决方案1】:

首先,我不知道什么是“python 进程”。一个过程就是一个过程。用什么语言写的东西,或者解释器可能在解释什么东西,与任何事情都无关。

接下来,我不确定“我以这种方式创建套接字,因为我已经有一个文件描述符”是什么意思。我没有看到您创建任何东西,而是将一些值从结构分配给另一个变量。

不知道您最初是如何实例化 socket,因此无法猜测资源问题可能是什么。

【讨论】:

  • 从字面上看,我的问题的第三行是实例化一个套接字:socket.fromfd(fd, family, type[, proto]) docs.python.org/2/library/socket.html#socket.fromfd
  • 这不是问题的答案。如果您需要澄清,请在评论部分提出您的问题。
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 2012-11-13
  • 2013-07-10
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
相关资源
最近更新 更多