【问题标题】:While loop not continuing after starting a new thread (python)启动新线程后循环不继续(python)
【发布时间】:2014-12-22 20:21:44
【问题描述】:

我有一个应该接受多个客户端的服务器,但由于某种原因,当它为客户端启动一个新线程时,它不会继续 while 循环,直到客户端断开连接。

此外,while 循环停止到 select.select,并且在 sock.accept 有挂起的连接之前不会继续。在我将 self.serverstatus 值更改为 0 后,它也无法正常中断并使套接字关闭

这是服务器的代码

编辑:将包含 ct.run() 的行修复为 ct.start()

 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.bind((self.host, self.port))

          inputs = [ s ]

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

        def client_thread(self, c, addr):
          print "Connection from: " + str(addr)
          while True:
                data = c.recv(1500)
                print len(data)
                if not data:
                        break
                data = str(data).upper()
                c.send(data)
                if self.serverstatus == "0":
                        break
          c.close()

【问题讨论】:

  • self.serverstatus 为何以及在何处更改其值?是否也可能是 while 循环一直在循环而您却没有注意到?
  • 你需要调用 start 而不是在 Thread 实例上运行。
  • self.serverstatus 从按钮切换时应该改变值。我试图在while循环中打印文本以查看它是否确实循环,但由于某种原因它卡在包含“inputready,outputready,exceptready = select.select(inputs,[],[])”的行直到它它有联系。我通过在该行的顶部和下方放置一个打印行来测试它,并且只有它上面的代码被执行,直到传入的连接允许它继续。

标签: python multithreading sockets multiprocessing


【解决方案1】:
ct.run()

我相信你在这里需要start,而不是run。线程的run 方法是线程启动时将执行的代码,但调用run 并不会真正在单独的线程中启动代码。

ct.start()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多