python .select 正在阻塞

标签 python sockets loops select

我有一个服务器套接字,用于监听传入连接并为每个客户端创建新套接字。我有一个 while 循环来保持服务器负责(能够在没有传入连接时使用按钮关闭它),为此我使用 .select 检查是否有任何连接。我遇到的问题是 .select 由于某种原因被阻止。它一直等到有连接,而不是检查连接然后继续。

    def serverstart(self):
      self.buttonswitch("1")
      self.host = self.intip
      self.port = 5000
      s = socket.socket(socket.AF_INET6)
      s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
      s.setblocking(0)
      s.bind((self.host, self.port))

      inputs = [ s ]

      s.listen(5)
      self.serverstatus = "1"
      while s:
            inputready, outputready, exceptready = select.select(inputs, [], [] )
            if inputready == inputs and self.serverstatus == "1":
                    print inputready
                    c, addr = s.accept()
                    ct = threading.Thread(target=self.client_thread, args=[c, addr])
                    ct.start()
            if self.serverstatus == "0":
                    break
      s.close()
      print "Closing socket"
      self.buttonswitch("0")

编辑:

为工作的非阻塞选择解决方案添加超时

            inputready, outputready, exceptready = select.select(inputs, [], [], 0.1 )

最佳答案

select 的第四个参数是超时。根据文档:

The optional timeout argument specifies a time-out as a floating point number in seconds. When the timeout argument is omitted the function blocks until at least one file descriptor is ready.

如果您想避免默认行为,您应该修改您的调用以包含可选参数。例如,select(inputs, [], [], 1)

Python Select Docs

关于python .select 正在阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27802984/

相关文章:

python - 在 django 中的 urlencode 之前连接

python - 在 Google Colab Pro 中使用 TPU v3

linux - 虚拟 IP 配置不起作用,我仍然收到地址已在使用错误

java - java新手,while循环?

Java while循环无休止地捕获不匹配异常

c++ - 如何在循环外设置初始值? C++

python - 如何保留字符串中的 '\n 字符?

C 在特定 IP 上打开套接字

python - 客户端断开Python连接时保持服务器打开

python - 如何在 BeautifulSoup 4 中找到明文同级?