Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 15907|Отговор: 2

[Източник] python3 реализира хоризонтални таблици за разделяне с паралелен достъп

[Копирай линк]
Публикувано в 29.11.2017 г. 21:15:55 ч. | | |
Описание на сценария

Да предположим, че има mysql таблица, която е хоризонтално разсечена, разпределена между няколко хоста, всеки с n sharded таблици.
Какво трябва да направя, ако трябва да достъпя тези таблици едновременно и да получа резултатите от заявките бързо?
Ето решение за реализиране на това изискване, използвайки asyncio asyncio библиотеката и aiomysql асинхронната библиотека на python3.

Демо на кода

Логване на внос
импорт на случаен принцип
import asyncio
От aiomysql import create_pool

# Да предположим, че таблицата mysql е разпределена между 8 хоста, всяка с 16 подтаблици
TBLES = {
    "192.168.1.01": "table_000-015", #000-015 показва, че индикацията под този IP е непрекъсната от table_000 до table_015
    "192.168.1.02": "table_016-031",
    "192.168.1.03": "table_032-047",
    "192.168.1.04": "table_048-063",
    "192.168.1.05": "table_064-079",
    "192.168.1.06": "table_080-095",
    "192.168.1.07": "table_096-0111",
    "192.168.1.08": "table_112-0127",
}
ПОТРЕБИТЕЛ = "xxx"
PASSWD = "xxxx"

# функция wrapper за улавяне на изключения
def query_wrapper(func):
    Async Def Wrapper(*args, **kwargs):
        Опитай:
            Waitit func(*args, **kwargs)
        с изключение на изключение като e:
            print(e)
    Връщаща обвивка


# Реалната функция за обработка на SQL достъп реализира асинхронни неблокиращи заявки чрез AIOMYSQL
@query_wrapper
Асинхронна защита query_do_something(IP, DB, таблица):
    async с create_pool(host=ip, db=db, user=USER, password=PASSWD) като пул:
        async с pool.get() като конк:
            асинхронизирано с conn.cursor() като cur:
                sql = ("Изберете xxx от {}, където xxxx")
                await cur.execute(sql.format(table))
                res = чакай cur.fetchall()
                # Тогава направи нещо...


# Генерирайте опашка за достъп до SQL – всеки елемент от опашката съдържа функции и параметри за достъп до таблица
def gen_tasks():
    задачи = []
    За ip, tbls в TBLES.items():
        cols = re.split('_|-', продължава да се говори)
        tblpre = "_".join(cols[:-2])
        min_num = int(cols[-2])
        max_num = int(cols[-1])
        за число в диапазон(min_num, max_num+1):
            tasks.append(
               (query_do_something, ip, 'your_dbname', '{}_{}'.format(tblpre, num))
            )

    random.shuffle(задачи)
    Задачи за връщане

# Стартирайте опашката за заявка за достъп до SQL на партиди
def run_tasks(задачи, batch_len):
    Опитай:
        За idx в обхват(0, len(задачи), batch_len):
            batch_tasks = задачи[idx:idx+batch_len]
            logging.info("текуща партида, start_idx:%s len:%s" % (idx, len(batch_tasks)))
            за i в диапазон(0, len(batch_tasks)):
                l = batch_tasks
                batch_tasks= asyncio.ensure_future(
                    l[0](*l[1:])
                )
            loop.run_until_complete(asyncio.gather(*batch_tasks))
    с изключение на изключение като e:
        logging.warn(e)

# основен метод, който реализира асинхронно извикване на функции чрез asyncio
Def Main():
    loop = asyncio.get_event_loop()

    задачи = gen_tasks()
    batch_len = len(TBLES.keys()) * 5 # всичко зависи от теб
    run_tasks(задачи, batch_len)

    loop.close()





Предишен:Как да се презаредите.
Следващ:WebAPI персонализира формата на връщаните данни
Публикувано в 30.11.2017 г. 9:03:52 ч. |
Добра база данни за spooling и оптимизация на таблици
Публикувано в 4.04.2018 г. 15:20:12 ч. |
Като
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com