Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 15907|Risposta: 2

[Fonte] Python3 implementa tabelle di partizionamento orizzontale con accesso concorrente

[Copiato link]
Pubblicato su 29/11/2017 21:15:55 | | |
Descrizione dello scenario

Supponiamo che esista una tabella mysql che viene tagliata orizzontalmente, distribuita su più host, ciascuno con n tabelle sharded.
Cosa dovrei fare se devo accedere a queste tabelle contemporaneamente e ottenere rapidamente i risultati delle query?
Ecco una soluzione per implementare questo requisito utilizzando la libreria asyncio asyncio e la libreria asincrona aiomysql di python3.

Demo del codice

Logging delle importazioni
importa casual
import asyncio
Da Import create_pool AioMySQL

# Supponiamo che la tabella mysql sia distribuita su 8 host, ciascuno con 16 sotto-tabelle
TBLES = {
    "192.168.1.01": "table_000-015", #000-015 indica che l'indicazione sotto questo IP è continua da table_000 a 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",
}
UTENTE = "xxx"
PASSWD = "xxxx"

# funzione wrapper per catturare eccezioni
def query_wrapper(func):
    Avvolgimento async def (*args, **kwargs):
        Prova:
            await func(*args, **kwargs)
        eccezione come e:
            Stampa(e)
    Involucro di ritorno


# La funzione effettiva di gestione degli accessi SQL implementa richieste asincrone non bloccanti tramite AIOMYSQL
@query_wrapper
Difesa asincrona query_do_something(IP, DB, tabella):
    async con create_pool(host=ip, db=db, user=USER, password=PASSWD) come pool:
        async con pool.get() come conn:
            async con conn.cursor() come cur:
                SQL = ("Seleziona xxx da {} dove xxxx")
                await cur.execute(sql.format(table))
                res = await cur.fetchall()
                # Allora fai qualcosa...


# Genera una coda di accesso SQL, ogni elemento della coda contiene funzioni e parametri per accedere a una tabella
difesa gen_tasks():
    Compiti = []
    per IP, tbls in TBLES.items():
        cols = re.split('_|-', tbls)
        tblpre = "_".join(cols[:-2])
        min_num = int(cols[-2])
        max_num = int(cols[-1])
        per num nell'intervallo(min_num, max_num+1):
            task.append(
               (query_do_something, ip, 'your_dbname', '{}_{}'.format(tblpre, num))
            )

    random.shuffle(compiti)
    Rientro i compiti

# Esegui la coda di richieste di accesso SQL in batch
Def run_tasks(compiti, batch_len):
    Prova:
        per IDX in Range(0, Len(Task), batch_len):
            batch_tasks = compiti[idx:idx+batch_len]
            logging.info("current batch, start_idx:%s len:%s" % (idx, len(batch_tasks)))
            per i in range(0, len(batch_tasks)):
                l = batch_tasks
                batch_tasks= asyncio.ensure_future(
                    l[0](*l[1:])
                )
            loop.run_until_complete(asyncio.gather(*batch_tasks))
    eccezione come e:
        logging.warn(e)

# Metodo principale, che implementa una chiamata asincrona di funzioni tramite asincrocio
def main():
    loop = asyncio.get_event_loop()

    compiti = gen_tasks()
    batch_len = len(TBLES.keys()) * 5 # tutto a tua scelta
    run_tasks(compiti, batch_len)

    loop.close()





Precedente:Come ricaricarsi.
Prossimo:WebAPI personalizza il formato dei dati di ritorno
Pubblicato su 30/11/2017 09:03:52 |
Buon database di spooling e ottimizzazione delle tabelle
Pubblicato su 04/04/2018 15:20:12 |
Tipo
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com