Многопоточный 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 проблемных сценария:
Может отвалиться один или несколько ip и ответ может приходить в таком виде
<ip> 2023-11-27 16:53:52.541271 # Разрыв соединения
<ip> 2023-11-27 16:53:53.056597 # Успешное подключение
Затем 5 секунд таймаут и всё повторяется
В какой-то момент происходит обрыв связи и почему-то обратно не подключается, может выдавать 2 ошибки
"[WinError 10061] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение"
и
"[WinError 10060] Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера"
После множества попыток подключиться и получения ошибок 10060 или 10061 приходит превышение глубины рекурсии и прекращение исполнения.
Подскажите куда копать? Есть ли глобальные проблемы в коде или это скорее сетевая проблема?