@minotavr1712

Зачем нужно наследование от потока в питоне?

Может кто-то объяснить пожалуйста, зачем нужно наследование от потока в классе в python?
Я заметил это в модуле создание Р2Р-сети, в которой у клиента такой сети в листе хранятся объекты класса нового соединения со своими функциями, который наследован от threading.Thread (наверное эта информация избыточна, так как и без неё вопрос понятен)
И я не понимаю зачем нужно наследование от потока, если однажды эти потоки (объекты класса соединения) стартуются, а потом всякие методы данного класса вызываются все равно основным потоком (я выводил в этих методах название потока и там выводился основной поток)
Возможно не до конца понимаю механику потоков, но тем не менее

class NodeConnection(threading.Thread):
    def __init__(self, main_node, sock, id, host, port):
        self.sock = sock
        ...
    def send(self, data, encoding_type='utf-8', compression='none'):
        ...
        print(threading.current_thread().name)
        self.sock.sendall(data + self.EOT_CHAR)

class Node(threading.Thread):
    def __init__(self, host, port, id=None, callback=None, max_connections=0):
        self.nodes_outbound = []  # Nodes that we are connected to (US)->N

    def send_to_node(self, n, data, compression='none'):
        self.message_count_send = self.message_count_send + 1
        if n in self.nodes_inbound or n in self.nodes_outbound:
            n.send(data, compression=compression)

    def connect_with_node(self, host, port, reconnect=False):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.debug_print("connecting to %s port %s" % (host, port))
        sock.connect((host, port))
        thread_client = self.create_new_connection(sock, connected_node_id, host, port)
        thread_client.start()
        self.nodes_outbound.append(thread_client)

    def create_new_connection(self, connection, id, host, port):
        return NodeConnection(self, connection, id, host, port)

if __name__ == "__main__":
    node = Node()
    node.start(<host>, <port>)
    node.send_to_node(<n>, <data>)


То есть в классе NodeConnection в методе send выводится имя потока, то выводится MainThread
И поэтому я не понимаю, зачем в таких случаях вообще нужно наследование от потока, если по итогу все равно выводится имя главного потока (Я не все функции конечно вставил, только те, о которых шла речь в вопрос, дабы не наполнять вопрос лишней информацией)
  • Вопрос задан
  • 447 просмотров
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
А для чего вы вырезали куски кода в методах? Там вполне может быть ответ на ваш вопрос, а нам как-то гадать надо на кофейной гузе?
К примеру в NodeConnection.__init__ вызывается наверно конструктор через super и туда вполне может быть передан target, а там может быть что угодно полезное и нужное, что обясняет ситуацию.
Почему не вставить полностью код для ясности?
UPD.
Наследование от треда здесь применяется потому, что каждый NodeConnection породит свой поток, в котором будет вычитываться свой инкапсулированный сокет) в который кажому инстансу NodeConnection передаются какие-то данные.
Можно было сделать просто отдельный класс и в него инкапсулировать и сокет и тред, но автор выбрал сокет инкапсулировать в тред.

В обзем NodeConnection - это тред с инкапсулированным сокетом для передачи ему данных из другого потока.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы