Создание многопоточного сервера с использованием инфраструктуры SocketServer в python

Этот вопрос решен. Рабочий код приведен ниже в этом сообщении.

Проблема: В настоящее время я знаком с сетевым программированием с Python. В настоящее время я работаю с инфраструктурой SocketServer. Теперь мой вопрос: как я могу создать многопоточный сервер, который может принимать более одного клиента, используя модуль SocketServer? Я в основном пытался использовать этот код

t = Thread(target=server.serve_forever())
t.start()

В настоящее время в моей программе сервер принимает только одного клиента. Я подключаюсь к серверу с помощью netcat. Первый клиент подключается к серверу без каких-либо проблем. Если я попытаюсь подключиться к серверу со второго клиента, клиент просто ждет, чтобы подключиться. Как только я отключу первого клиента, второй клиент автоматически подключится к серверу. Мне кажется, что многопоточность не работает. Я не могу понять, где я чего-то не хватает. Любой намек будет большим. Мой код выглядит следующим образом:

#!/usr/bin/env python

import SocketServer
from threading import Thread


class service(SocketServer.BaseRequestHandler):
    def handle(self):
        data = 'dummy'
        print "Client connected with ", self.client_address
        while len(data):
            data = self.request.recv(1024)
            self.request.send(data)

        print "Client exited"
        self.request.close()



server = SocketServer.TCPServer(('',1520), service)
t = Thread(target=server.serve_forever())
t.start()

Спасибо

Update: Следующий код - это решение:

#!/usr/bin/env python


import SocketServer
from threading import Thread

class service(SocketServer.BaseRequestHandler):
    def handle(self):
        data = 'dummy'
        print "Client connected with ", self.client_address
        while len(data):
            data = self.request.recv(1024)
            self.request.send(data)

        print "Client exited"
        self.request.close()


class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

t = ThreadedTCPServer(('',1520), service)
t.serve_forever()

Ответ 1

Это намного проще, чем вы думаете:

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

Вместо того, чтобы просто использовать ThreadedTCPServer вместо TCPServer вместо TCPServer.

Для получения дополнительной информации вы можете прочитать несколько документов.

Однако в вашем коде вы допустили некоторые ошибки:

  • Аргумент target должен быть callable объектом, а не "уже вызванным" объектом.
  • Чтобы обрабатывать множество запросов, вам нужно создать пул потоков. Если вы используете только один поток, это не имеет никакого значения, если это основной поток или "дочерний" поток.

Ответ 2

Ну, спасибо @Faust за предложение. Теперь приведенный ниже код работает, как и предполагалось.

#!/usr/bin/env python

import SocketServer
from threading import Thread


class service(SocketServer.BaseRequestHandler):
    def handle(self):
        data = 'dummy'
        print "Client connected with ", self.client_address
        while len(data):
            data = self.request.recv(1024)
            self.request.send(data)

        print "Client exited"
        self.request.close()


class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass


server = ThreadedTCPServer(('',1520), service)
server.serve_forever()

Ответ 3

Не следует ли вы зацикливать

server = SocketServer.TCPServer(('',1520), service)
t = Thread(target=server.serve_forever())
t.start()

Просто догадаться.