Обработка процесса сокета в классе в Python

Я использую Python 2.6 и новичок в сокетах и ​​потоках.

Мне нужно написать код сокета для перечисления определенных портов. Ниже приведен мой связанный класс сокета:

class SocketServer(object):
    """
    """
    def __init__(self, host, sock_port, buffsize=1024):
        self.hostname = host
        self.sock_port = sock_port
        self.buffsize = buffsize
        self.socket = None

    def start(self):
        print "Listening: "
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.socket.bind((self.hostname, self.sock_port))
        self.socket.listen(10)

        while True:
            conn, address = self.socket.accept()
            thread.start_new_thread(handle_data, (conn, self.buffsize))

if __name__ == "__main__":
    server = socketServer(ip, port)
    try:
        server.start()
    except Exception as e:
        print e

handle_data - это функция, которая прослушивает определенный порт:

def handle_data(conn, buffsize):
    while True:
        try:
            _veri = conn.recv(buffsize)
            if not _veri:
                break
        except Exception as e:
            break
        # Do something else
    conn.close()

Все работает нормально, но у handle_data есть длинный код, поэтому я хочу написать его как класс.

Первый вопрос: кому я могу написать это как класс? Во-вторых, многопоточность класса при прослушивании сокетов имеет какие-либо недостатки (значительная разница в использовании памяти и т. Д.) Над распараллеливанием функции?


person FallenAngel    schedule 24.04.2015    source источник
comment
Не совсем точно решение, но может быть полезно взглянуть на модуль SocketServer: )   -  person Joel Hermanns    schedule 24.04.2015


Ответы (1)


Нет никакой разницы между потоками в классе и функцией.

По сути, каждый запускаемый поток будет запускать функцию.

Затем распараллеливание класса подразумевает написание класса с функцией точки входа, которая будет управлять вашим экземпляром. Все, что вам нужно будет написать, это:

thread.start_new_thread(myClassInstance.handle_data, (conn, self.buffsize))

Единственное отличие состоит в том, что при использовании класса накладные расходы будут очень низкими из-за аргумента self, передаваемого при каждом вызове метода. Думаю, что на данный момент этим можно пренебречь.

person Raito    schedule 24.04.2015
comment
Будет ли myClassInstance производным от threading.Thread? Извините за такие вопросы, но я довольно щепетилен в этой теме. - person FallenAngel; 28.04.2015
comment
@FallenAngel Нет, не нужно. В Python функции - это первоклассные граждане. Следствием этого является то, что instance.function является связанным методом, который можно вызывать без аргумента self. Чтобы проиллюстрировать то, что я говорю, допустим, у вас есть класс с методом dance(self, time), чтобы его вызвать, вам нужны параметры self и time. self - это класс экземпляра. В Python параметр self автоматически привязывается с помощью экземпляра. Таким образом, вам нужно указать только параметр time. Здесь то же самое. Ваш параметр handle_data self привязан к myClassInstance. - person Raito; 28.04.2015