Форум сайта python.su
Доброго времени суток.
Мне необходимо реализовать многопоточное редактирование базы данных.
Конкретно, будет поллимона айпишников в базе данных, мне нужно все пропинговать, и записать в таблицу (другую).
Постоянно лезут ошибки либо Ошибка сегментирования, либо 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())
Отредактировано sashaaero (Апрель 20, 2015 15:01:51)
Офлайн
А не хотите не выносить себе мозг и использовать ОРМ?
Офлайн
4kpt_IIIА можно чуть более подробно? По поиску в гугле находит много чего, и в целом оно не особо по теме.
А не хотите не выносить себе мозг и использовать ОРМ?
Офлайн
sashaaero
Попробуйте SQLAlchemy. На русском - https://ru.wikibooks.org/wiki/SQLAlchemy Оффициальная документация - http://docs.sqlalchemy.org/en/latest/index.html
Офлайн
MetalHead
Ага. Алхимия рулит.
sashaaero
Лучше читать официальную документацию. После 40 страниц сможете выполнять все основные операции и запросы.
Отредактировано 4kpt_III (Апрель 20, 2015 15:22:27)
Офлайн
Спасибо за совет.
Немного прочел о сущности, но пока не понял, как это поможет решить мою проблему.
Ну, буду смотреть дальше.
Офлайн
У вас сейчас все потоки работают с базой через одно соединение. Создавайте для каждого потока свое или организуйте пул.
Офлайн