Python 使用多线程的套接字非阻塞服务器

Python Sockets Non-blocking Server using Multithreading

我正在 Python 中构建一个点对点库,使用 TCP 套接字和多线程来处理对等连接。我想要一个 main.py 来创建 Node class 的实例,启动服务器侦听端口上的连接,然后调用 class 的一些方法.

e.x. main.py

from p2p import Node

a = Node(port=6666)
a.connect("138.197.105.184", 6666)

由于 运行 连接服务器是一个阻塞调用,我想 运行 它在一个单独的线程中,以便程序可以继续做事(比如连接到其他节点)同时也在监听连接。

在线程中启动服务器的节点 运行s self.startServer。 来自服务器的新连接也在它们自己的线程中处理。

p2p.py

def startServer(self):
        start_new_thread(self.startThreadedServer, ())

def startThreadedServer(self):
        while 1: # blocking call
            logging.debug("Waiting for connection")
            conn, addr = self.server.accept()
            logging.debug(conn + " " + addr)
            logging.info('Connected with ' + addr[0] + ':' + str(addr[1]))
            start_new_thread(self.clientThread ,(conn,))

def clientThread(self, conn):
        while True:
            #Receiving from client
            data = conn.recv(1024)
            if is_json(data):
                payload = json.loads(data)
                reply = self.respond(payload)
            if not data:
                break
            conn.sendall(reply)
        conn.close()

但是,当服务器运行这样时,所有套接字连接都会失败。

当我 运行 self.startThreadedServer() 作为服务器时,它接受连接但它是一个阻塞调用。不好。

如何启动服务器并让服务器在后台继续监听和接受连接?

关于线程的工作原理,我被误导了。我认为程序应该在后台 运行 个线程 运行 之后终止。相反,程序根本不应该终止。

两个节点都应该在 while 循环中主动监听连接。为了实现所需的功能,整个程序应该使用 python-daemon package.

之类的东西进行守护进程。