Найти - Пользователи
Полная версия: Многопоточность для работы с одной таблицей.
Начало » Базы данных » Многопоточность для работы с одной таблицей.
1
sashaaero
Доброго времени суток.
Мне необходимо реализовать многопоточное редактирование базы данных.
Конкретно, будет поллимона айпишников в базе данных, мне нужно все пропинговать, и записать в таблицу (другую).
Постоянно лезут ошибки либо Ошибка сегментирования, либо 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.
База локально доступная, можете не коннектиться
4kpt_III
А не хотите не выносить себе мозг и использовать ОРМ?
sashaaero
4kpt_III
А не хотите не выносить себе мозг и использовать ОРМ?
А можно чуть более подробно? По поиску в гугле находит много чего, и в целом оно не особо по теме.
MetalHead
sashaaero
Попробуйте SQLAlchemy. На русском - https://ru.wikibooks.org/wiki/SQLAlchemy Оффициальная документация - http://docs.sqlalchemy.org/en/latest/index.html
4kpt_III
MetalHead
Ага. Алхимия рулит.

sashaaero
Лучше читать официальную документацию. После 40 страниц сможете выполнять все основные операции и запросы.
sashaaero
Спасибо за совет.
Немного прочел о сущности, но пока не понял, как это поможет решить мою проблему.
Ну, буду смотреть дальше.
PooH
У вас сейчас все потоки работают с базой через одно соединение. Создавайте для каждого потока свое или организуйте пул.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB