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

2024-06-28 21:32:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python构建一个对等库,使用TCP套接字和多线程来处理对等连接。我希望有一个main.py来创建一个Node类的实例,启动一个服务器侦听端口上的连接,然后调用该类的一些方法。你知道吗

e.x. main.py

from p2p import Node

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

因为运行服务器是一个阻塞调用,所以我想在一个单独的线程中运行它,这样程序就可以在侦听连接的同时继续执行操作(比如连接到其他节点)。你知道吗

节点运行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()时,它接受连接,但它是一个阻塞调用。无益。你知道吗

如何启动服务器并让服务器在后台继续侦听和接受连接?你知道吗


Tags: frompyself服务器nodedata节点main
1条回答
网友
1楼 · 发布于 2024-06-28 21:32:35

关于线程是如何工作的,我被误传了。我认为程序应该在后台运行线程后终止。相反,程序根本不应该终止。你知道吗

两个节点都应该在while循环中主动侦听连接。为了实现所需的功能,应该使用python-daemon包之类的东西对整个程序进行后台监控。你知道吗

相关问题 更多 >