Мне необходимо реализовать многопоточное редактирование базы данных.
Конкретно, будет поллимона айпишников в базе данных, мне нужно все пропинговать, и записать в таблицу (другую).
Постоянно лезут ошибки либо Ошибка сегментирования, либо MySQL server has gone away.
Собственно, вот код, может я сделал что-то не так?
Или может сама идея чем плоха?
Буду признателен любым советам.
#!usr/bin/python # -*- coding: utf-8 -*- """Updating DNS database""" #ver 1 (18.04.2015) import MySQLdb import pyping import socket, struct from threading import Thread def ip2int(addr): """Convert ip to integer""" return struct.unpack("!I", socket.inet_aton(addr))[0] def int2ip(addr): """Convert integer to ip""" return socket.inet_ntoa(struct.pack("!I", addr)) def ping(ip): """Pinging client""" request = pyping.ping(ip, timeout=100, count=1) return int(request.max_rtt) class UpdateThread(Thread): def __init__(self, records, name, db): Thread.__init__(self) self.database = db self.cursor = database.cursor() self.name = name self.records = records def run(self): print(self.name) for r in self.records: #latency = ping(int2ip(r[1])) what the hell :x #ip = str(int2ip(r[1])) id = str(r[0]) self.cursor.execute("""update metric set spb_metric=%s where id=%s""" % (id, id)) self.database.commit() print(self.name + " commited") #start database = MySQLdb.connect(host="172.16.4.125", port=3306, user="root", passwd="***", db="dns") cursor = database.cursor() cursor.execute("""select * from clients""") data = cursor.fetchall() #All records from DataBase count = len(data) threads_counter = 2 #We are creating 10 threads for all records th_count = count / threads_counter #Count of records for each thread last_thread = count % threads_counter #Last records threads = [] i = 0 while i < (count - last_thread): temp_list = data[i:(i+th_count)] #print(temp_list) threads.append(UpdateThread(records = temp_list, name = "Thread: " + str((i/3) + 1), db = database).start()) i += th_count threads.append(UpdateThread(records = data[i: count], name = "Thread: 11", db = database).start())
P.S.
База локально доступная, можете не коннектиться