Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 20, 2015 14:56:43

sashaaero
Зарегистрирован: 2015-04-20
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность для работы с одной таблицей.

Доброго времени суток.
Мне необходимо реализовать многопоточное редактирование базы данных.
Конкретно, будет поллимона айпишников в базе данных, мне нужно все пропинговать, и записать в таблицу (другую).
Постоянно лезут ошибки либо Ошибка сегментирования, либо 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.
База локально доступная, можете не коннектиться

Отредактировано sashaaero (Апрель 20, 2015 15:01:51)

Офлайн

#2 Апрель 20, 2015 15:03:20

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Многопоточность для работы с одной таблицей.

А не хотите не выносить себе мозг и использовать ОРМ?

Офлайн

#3 Апрель 20, 2015 15:06:25

sashaaero
Зарегистрирован: 2015-04-20
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность для работы с одной таблицей.

4kpt_III
А не хотите не выносить себе мозг и использовать ОРМ?
А можно чуть более подробно? По поиску в гугле находит много чего, и в целом оно не особо по теме.

Офлайн

#4 Апрель 20, 2015 15:11:59

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

Многопоточность для работы с одной таблицей.

sashaaero
Попробуйте SQLAlchemy. На русском - https://ru.wikibooks.org/wiki/SQLAlchemy Оффициальная документация - http://docs.sqlalchemy.org/en/latest/index.html

Офлайн

#5 Апрель 20, 2015 15:22:15

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Многопоточность для работы с одной таблицей.

MetalHead
Ага. Алхимия рулит.

sashaaero
Лучше читать официальную документацию. После 40 страниц сможете выполнять все основные операции и запросы.

Отредактировано 4kpt_III (Апрель 20, 2015 15:22:27)

Офлайн

#6 Апрель 20, 2015 15:47:53

sashaaero
Зарегистрирован: 2015-04-20
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность для работы с одной таблицей.

Спасибо за совет.
Немного прочел о сущности, но пока не понял, как это поможет решить мою проблему.
Ну, буду смотреть дальше.

Офлайн

#7 Апрель 20, 2015 18:29:59

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Многопоточность для работы с одной таблицей.

У вас сейчас все потоки работают с базой через одно соединение. Создавайте для каждого потока свое или организуйте пул.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version