Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 15907|Atbildi: 2

[Avots] Python3 ievieš vienlaicīgas piekļuves horizontālās nodalījuma tabulas

[Kopēt saiti]
Publicēts 29.11.2017 21:15:55 | | |
Scenārija apraksts

Pieņemsim, ka ir mysql tabula, kas ir sagriezta horizontāli, sadalīta vairākos resursdatoros, katrs ar n sadalītām tabulām.
Kā rīkoties, ja vienlaicīgi jāpiekļūst šīm tabulām un ātri jāsaņem vaicājuma rezultāti?
Šeit ir risinājums, kā īstenot šo prasību, izmantojot asyncio asyncio bibliotēku un python3 aiomysql asinhrono bibliotēku.

Koda demonstrācija

Importa reģistrēšana
importēt pēc nejaušības principa
Import asyncio
no aiomysql importa create_pool

# Pieņemsim, ka mysql tabula ir sadalīta pa 8 saimniekiem, katram no tiem ir 16 apakštabulas
TBLES = {
    "192.168.1.01": "table_000-015", #000-015 norāda, ka indikācija saskaņā ar šo IP ir nepārtraukta no table_000 līdz 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",
}
LIETOTĀJS = "xxx"
PASSWD = "xxxx"

# iesaiņojuma funkcija, lai noķertu izņēmumus
def query_wrapper(func):
    asinhrons def wrapper(*args, **kwargs):
        Izmēģiniet:
            gaida func(*args, **kwargs)
        izņemot izņēmumu kā e:
            drukāt(e)
    Atgriešanas iesaiņojums


# Faktiskā SQL piekļuves apstrādes funkcija īsteno asinhronus nebloķējošus pieprasījumus, izmantojot AIOMYSQL
@query_wrapper
Async def query_do_something(ip, db, tabula):
    asinhrons ar create_pool(host=ip, db=db, user=USER, password=PASSWD) kā baseinu:
        async ar pool.get() kā conn:
            asinhrons ar conn.cursor() kā cur:
                sql = ("atlasiet xxx no {}, kur xxxx")
                gaidīt cur.execute(sql.format(tabula))
                res = gaidīt cur.fetchall()
                # tad dariet kaut ko ...


# Ģenerējiet SQL piekļuves rindu, katrs rindas elements satur funkcijas un parametrus, lai piekļūtu tabulai
def gen_tasks():
    uzdevumi = []
    ip, tbls TBLES.items():
        cols = re.split('_|-', tbls)
        tblpre = "_".join(cols[:-2])
        min_num = int(kolonnas[-2])
        max_num = int(kolonnas[-1])
        Skaitlim diapazonā(min_num, max_num+1):
            uzdevumi.pievienot(
               (query_do_something, ip, 'your_dbname', '{}_{}'.format(tblpre, num))
            )

    random.shuffle(uzdevumi)
    Atgriešanas uzdevumi

# Palaidiet SQL piekļuves pieprasījuma rindu partijās
def run_tasks(uzdevumi, batch_len):
    Izmēģiniet:
        IDX diapazonā(0, len(uzdevumi), batch_len):
            batch_tasks = uzdevumi[idx:idx+batch_len]
            logging.info("pašreizējā partija, start_idx:%s len:%s" % (idx, len(batch_tasks)))
            i diapazonā(0, len(batch_tasks)):
                l = batch_tasks
                batch_tasks= asyncio.ensure_future(
                    l[0](*l[1:])
                )
            loop.run_until_complete(asyncio.gather(*batch_tasks))
    izņemot izņēmumu kā e:
        reģistrēšana.brīdinājums(e)

# galvenā metode, kas īsteno asinhronu funkciju izsaukšanu, izmantojot asyncio
def main():
    cilpa = asyncio.get_event_loop()

    uzdevumi = gen_tasks()
    batch_len = len(TBLES.keys()) * 5 # viss atkarīgs no jums
    run_tasks(uzdevumi, batch_len)

    cilpa.aizvērt()





Iepriekšējo:Kā uzlādēt.
Nākamo:WebAPI pielāgo atgriezto datu formātu
Publicēts 30.11.2017 09:03:52 |
Laba spolēšanas un tabulu optimizācijas datu bāze
Publicēts 04.04.2018 15:20:12 |
Patīk
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com