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()
|