Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 15907|Odpověď: 2

[Zdroj] python3 implementuje horizontální rozdělovací tabulky s paralelním přístupem

[Kopírovat odkaz]
Zveřejněno 29.11.2017 21:15:55 | | |
Popis scénáře

Představme si, že existuje tabulka mysql, která je horizontálně rozdělená, rozložená mezi více hostitelů, každý s n rozdělenými tabulkami.
Co mám dělat, pokud potřebuji současně přistupovat k těmto tabulkám a rychle získat výsledky dotazu?
Zde je řešení, jak tento požadavek implementovat pomocí knihovny asyncio asyncio a asynchronní knihovny aiomysql v python3.

Demo kódu

Import logging
importovat náhodně
import asyncio
Z aiomysql import create_pool

# Předpokládejme, že tabulka mysql je rozložena na 8 hostitelích, z nichž každý má 16 podtabulek
TBLES = {
    "192.168.1.01": "table_000-015", #000-015 znamená, že indikace pod touto IP je kontinuální od table_000 do 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",
}
UŽIVATEL = "xxx"
PASSWD = "xxxx"

# funkce obalu pro zachycení výjimek
Def query_wrapper(FUNC):
    Async def wrapper(*args, **kwargs):
        Try:
            čekaj na func(*args, **kwargs)
        kromě výjimky jako e:
            Print(e)
    return wrapper


# Skutečná funkce SQL přístupu implementuje asynchronní neblokující požadavky prostřednictvím AIOMYSQL
@query_wrapper
Async Def query_do_something(IP, DB, tabulka):
    asynchronní s create_pool(host=IP, db=db, user=USER, password=PASSWD) jako pool:
        Asynchronní s pool.get() jako Conn:
            Asynchronní s conn.cursor() jako cur:
                sql = ("vyberte xxx z {} kde xxxx")
                await cur.execute(sql.format(table))
                res = await cur.fetchall()
                # Tak něco udělej...


# Generujte SQL přístupovou frontu, každý prvek fronty obsahuje funkce a parametry pro přístup k tabulce
def gen_tasks():
    úkoly = []
    pro IP TBLS v TBLES.items():
        cols = re.split('_|-', tbls)
        tblpre = "_".join(cols[:-2])
        min_num = int(cols[-2])
        max_num = int(cols[-1])
        pro num v dosahu (min_num, max_num+1):
            tasks.append(
               (query_do_something, ip, 'your_dbname', '{}_{}'.format(tblpre, num))
            )

    random.shuffle(tasks)
    Návratové úkoly

# Spouštějte frontu SQL přístupových požadavků v dávkách
Def run_tasks(úkoly, batch_len):
    Try:
        pro IDX v rozsahu (0, len(tasks), batch_len):
            batch_tasks = tasks[idx:idx+batch_len]
            logging.info("aktuální várka, start_idx:%s len:%s" % (idx, len(batch_tasks)))
            pro i v rozsahu(0, len(batch_tasks)):
                l = batch_tasks
                batch_tasks= asyncio.ensure_future(
                    l[0](*l[1:])
                )
            loop.run_until_complete(asyncio.gather(*batch_tasks))
    kromě výjimky jako e:
        log.warn(e)

# hlavní metoda, která implementuje asynchronní volání funkcí pomocí asyncio
def main():
    loop = asyncio.get_event_loop()

    úkoly = gen_tasks()
    batch_len = len(TBLES.keys()) * 5 # je to na tobě
    run_tasks(úkoly, batch_len)

    loop.close()





Předchozí:Jak se dobít.
Další:WebAPI přizpůsobuje formát návratových dat
Zveřejněno 30.11.2017 9:03:52 |
Dobrá databáze pro spooling a optimalizaci tabulek
Zveřejněno 04.04.2018 15:20:12 |
Jako
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com