Многопоточный TCP/IP клиент на python

Имеется 6 ip-адресов, нужно с каждого получать информацию и записывать их в БД. Получение информации в идеале должно происходить бесконечно. Я создал для каждого адреса поток и начинаю их слушать и обрабатывать полученные данные. Вот мой код:

import datetime
import socket
import threading
from configparser import ConfigParser

import psycopg2


config = ConfigParser()
config.read('config.ini')

def write_to_db(*args):
    try:
        params = {
            'database': config.get('postgres', 'db_name'),
            'user': config.get('postgres', 'login'),
            'password': config.get('postgres', 'password'),
            'host': 'localhost',
            'port': server.local_bind_port
        }
        connection = psycopg2.connect(**params)
        cursor = connection.cursor()
        cursor.execute(sql_script)
        connection.commit()
    except Exception as e:
        print(ip, e)
    finally:
        if connection:
            cursor.close()
            connection.close()


def f(ip):
    try:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect((ip, port))
        client.settimeout(5)
    except Exception as e:
        print(ip, e)
        f(ip)
    while True:
        try:
            print(ip, datetime.datetime.now())
            response = client.recv(1024)
            print(response)
        except Exception as e:
            print(ip, datetime.datetime.now(), e)
            client.shutdown(2)
            client.close()
            f(ip)
        try:
            write_to_db(*args)
        except Exception as e:
            print(e)


def main():
    t1 = threading.Thread(name='t1', target=f, args=(host1,))
    t2 = threading.Thread(name='t2', target=f, args=(host2,))
    t3 = threading.Thread(name='t3', target=f, args=(host3,))
    t4 = threading.Thread(name='t4', target=f, args=(host4,))
    t5 = threading.Thread(name='t5', target=f, args=(host5,))
    t6 = threading.Thread(name='t6', target=f, args=(host6,))
    t1.start()
    t2.start()
    t3.start()
    t4.start()
    t5.start()
    t6.start()


if __name__ == '__main__':
    main()

И поначалу все работает, но через некоторое время возникают 2 проблемных сценария:

  1. Может отвалиться один или несколько ip и ответ может приходить в таком виде

    <ip> 2023-11-27 16:53:52.541271 # Разрыв соединения

    <ip> 2023-11-27 16:53:53.056597 # Успешное подключение

    Затем 5 секунд таймаут и всё повторяется

  2. В какой-то момент происходит обрыв связи и почему-то обратно не подключается, может выдавать 2 ошибки

"[WinError 10061] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение"

и

"[WinError 10060] Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера"

После множества попыток подключиться и получения ошибок 10060 или 10061 приходит превышение глубины рекурсии и прекращение исполнения.

Подскажите куда копать? Есть ли глобальные проблемы в коде или это скорее сетевая проблема?


Ответы (0 шт):