Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 15907|Svare: 2

[Kilde] Python3 implementerer horisontale partisjoneringstabeller med samtidig tilgang

[Kopier lenke]
Publisert på 29.11.2017 21:15:55 | | |
Scenariobeskrivelse

Anta at det finnes en mysql-tabell som er delt horisontalt, fordelt over flere verter, hver med n shardede tabeller.
Hva bør jeg gjøre hvis jeg trenger å få tilgang til disse tabellene samtidig og få spørringsresultatene raskt?
Her er en løsning for å implementere dette kravet ved å bruke asyncio asyncio-biblioteket og aiomysql asynkronbiblioteket i python3.

Kodedemo

Importlogging
importer tilfeldig
Import Asyncio
Fra AioMySQL Import create_pool

# Anta at mysql-tabellen er fordelt på 8 verter, hver med 16 undertabeller
TBLES = {
    "192.168.1.01": "table_000-015", #000-015 indikerer at indikasjonen under denne IP-en er kontinuerlig fra table_000 til 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",
}
BRUKER = "xxx"
PASSWD = "xxxx"

# wrapper-funksjon for å fange unntak
def query_wrapper(func):
    Async Def Wrapper(*args, **kwargs):
        Prøv:
            await func(*args, **kwargs)
        unntatt unntak som e:
            print(e)
    Returinnpakning


# Den faktiske SQL-tilgangshåndteringsfunksjonen implementerer asynkrone, ikke-blokkerende forespørsler gjennom AIOMYSQL
@query_wrapper
Async Def query_do_something(IP, DB, Table):
    asynkron med create_pool(host=ip, db=db, user=USER, password=PASSWD) som pool:
        Asynkron med pool.get() som conn:
            asynkron med conn.cursor() som cur:
                SQL = ("velg xxx fra {} hvor xxxx")
                await cur.execute(sql.format(table))
                res = vent på cur.fetchall()
                # så gjør noe...


# Generer en SQL-tilgangskø, hvert element i køen inneholder funksjoner og parametere for å få tilgang til en tabell
def gen_tasks():
    oppgaver = []
    for ip, tbls i TBLES.items():
        cols = re.split('_|-', tbls)
        tblpre = "_".join(cols[:-2])
        min_num = int(kols[-2])
        max_num = int(kols[-1])
        for num i område(min_num, max_num+1):
            tasks.append(
               (query_do_something, ip, 'your_dbname', '{}_{}'.format(tblpre, num))
            )

    random.shuffle(oppgaver)
    Return-oppgaver

# Kjør SQL-tilgangsforespørselskøen i batcher
def run_tasks(oppgaver, batch_len):
    Prøv:
        for idx i range(0, len(tasks), batch_len):
            batch_tasks = oppgaver[idx:idx+batch_len]
            logging.info("nåværende batch, start_idx:%s len:%s" % (idx, len(batch_tasks)))
            for i i i rekkevidde(0, len(batch_tasks)):
                l = batch_tasks
                batch_tasks= asyncio.ensure_future(
                    l[0](*l[1:])
                )
            loop.run_until_complete(asyncio.gather(*batch_tasks))
    unntatt unntak som e:
        logging.warn(e)

# Hovedmetode, som implementerer asynkront kall av funksjoner gjennom asyncio
def main():
    loop = asyncio.get_event_loop()

    oppgaver = gen_tasks()
    batch_len = len(TBLES.keys()) * 5 # alt opp til deg
    run_tasks(oppgaver, batch_len)

    loop.close()





Foregående:Hvordan lade opp.
Neste:WebAPI tilpasser returdataformatet
Publisert på 30.11.2017 09:03:52 |
God database for spooling og tabelloptimalisering
Publisert på 04.04.2018 15:20:12 |
Som
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com