【问题标题】:python .select is blockingpython .select 被阻塞
【发布时间】:2015-01-06 16:32:45
【问题描述】:

我有一个服务器套接字,它监听传入的连接并为每个客户端创建新的套接字。我有一个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 )

【问题讨论】:

  • "使用按钮关闭它" ...所以这是 GUI 的一部分吗? GUI 是否有自己的处理套接字的方法?

标签: python sockets loops select


【解决方案1】:

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

可选的timeout 参数将超时指定为以秒为单位的浮点数。当 timeout 参数省略功能块,直到至少一个文件描述符准备就绪。

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

Python Select Docs

【讨论】:

  • 使用0 轮询,无需等待。
  • 您提供的解决方案有效,谢谢。实际上我之前用 0 表示超时,但由于某种原因它不能正常工作。
猜你喜欢
  • 2020-08-19
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 2014-07-29
  • 1970-01-01
相关资源
最近更新 更多