Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 15907|Odpoveď: 2

[Zdroj] python3 implementuje horizontálne rozdeľovanie tabuliek s paralelným prístupom

[Kopírovať odkaz]
Zverejnené 29. 11. 2017 21:15:55 | | |
Popis scenára

Predpokladajme, že existuje mysql tabuľka, ktorá je horizontálne rozdelená, rozložená na viacerých hostiteľoch, pričom každý má n rozdelených tabuliek.
Čo mám robiť, ak potrebujem pristupovať k týmto tabuľkám súčasne a rýchlo získať výsledky dotazu?
Tu je riešenie, ako túto požiadavku implementovať pomocou knižnice asyncio asyncio a aiomysql asynchrónnej knižnice python3.

Demo kódu

importné zaznamenávanie
importovať náhodne
import asyncio
Z aiomysql import create_pool

# Predpokladajme, že mysql tabuľka je rozložená na 8 hostiteľov, z ktorých každý má 16 podtabuliek
TBLES = {
    "192.168.1.01": "table_000-015", #000-015 znamená, že označenie pod touto IP je kontinuálne 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ŽÍVATEĽ = "xxx"
PASSWD = "xxxx"

# obalová funkcia na zachytenie výnimiek
Def query_wrapper(FUNC):
    Async def wrapper (*args, **kwargs):
        Skúsiť:
            čakať na func(*args, **kwargs)
        okrem výnimky ako e:
            Print(e)
    Return wrapper


# Skutočná funkcia spracovania SQL prístupu implementuje asynchrónne neblokujúce požiadavky cez AIOMYSQL
@query_wrapper
Async Def query_do_something(IP, DB, Table):
    async s create_pool(host=ip, db=db, user=USER, password=PASSWD) ako pool:
        Asynchrónne s pool.get() ako Conn:
            Asynchrónne s conn.cursor() ako cur:
                sql = ("vyberte xxx z {} kde xxxx")
                await cur.execute(sql.format(table))
                res = await cur.fetchall()
                # Tak urob niečo...


# Vygenerujte SQL prístupovú frontu, každý prvok fronty obsahuje funkcie a parametre na prístup k tabuľke
def gen_tasks():
    úlohy = []
    pre IP, tbls v TBLES.items():
        cols = re.split('_|-', tbls)
        tblpre = "_".join(cols[:-2])
        min_num = int(cols[-2])
        max_num = int(cols[-1])
        pre num v rozsahu(min_num, max_num+1):
            tasks.append(
               (query_do_something, ip, 'your_dbname', '{}_{}'.format(tblpre, num))
            )

    random.shuffle(tasks)
    Vrátiť úlohy

# Spúšťajte SQL prístupovú požiadavku v dávkach
def run_tasks(úlohy, batch_len):
    Skúsiť:
        pre idx v rozsahu(0, len(tasks), batch_len):
            batch_tasks = úlohy[idx:idx+batch_len]
            logging.info("aktuálna dávka, start_idx:%s len:%s" % (idx, len(batch_tasks)))
            pre 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))
    okrem výnimky ako e:
        log.warn(e)

# hlavná metóda, ktorá implementuje asynchrónne volanie funkcií prostredníctvom asyncio
def main():
    slučka = asyncio.get_event_loop()

    úlohy = gen_tasks()
    batch_len = len(TBLES.keys()) * 5 # všetko je na tebe
    run_tasks(úlohy, batch_len)

    loop.close()





Predchádzajúci:Ako sa nabiť energiou.
Budúci:WebAPI prispôsobuje formát vrátených dát
Zverejnené 30. 11. 2017 9:03:52 |
Dobrá databáza na spooling a optimalizáciu tabuliek
Zverejnené 4. 4. 2018 15:20:12 |
Ako
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com