Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 15907|Odgovoriti: 2

[Vir] python3 implementira horizontalne tabele za sočasni dostop

[Kopiraj povezavo]
Objavljeno na 29. 11. 2017 21:15:55 | | |
Opis scenarija

Predpostavimo, da obstaja mysql tabela, ki je razdeljena vodoravno, razporejena na več gostiteljev, vsak z n razdeljenimi tabelami.
Kaj naj storim, če moram hkrati dostopati do teh tabel in hitro dobiti rezultate poizvedb?
Tukaj je rešitev za izvedbo te zahteve z uporabo knjižnice asyncio asyncio in asinhrone knjižnice aiomysql v python3.

Demo kode

Uvozno beleženje
Uvoz naključno
uvoz asyncio
From aiomysql import create_pool

# Predpostavimo, da je mysql tabela razporejena na 8 gostiteljev, vsak s 16 podtabelami
TBLES = {
    "192.168.1.01": "table_000-015", #000-015 označuje, da je oznaka pod to IP neprekinjena 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",
}
USER = "xxx"
PASSWD = "xxxx"

# funkcija ovijalca za zajem izjem
def query_wrapper(func):
    Async def wrapper (*args, **kwargs):
        Poskusi:
            čakaj func(*args, **kwargs)
        razen izjeme kot e:
            Print(e)
    Povratni ovijalec


# Dejanska funkcija upravljanja dostopa SQL implementira asinhrone neblokirajoče zahteve preko AIOMYSQL
@query_wrapper
Async Def query_do_something(IP, DB, tabela):
    async z create_pool(host=ip, db=db, user=USER, password=PASSWD) kot bazen:
        Async s pool.get() kot conn:
            Asinhrono s conn.cursor() kot cur:
                sql = ("izberi xxx iz {} kjer xxxx")
                await cur.execute(sql.format(table))
                res = await cur.fetchall()
                # potem naredi nekaj...


# Ustvarite SQL dostopno vrsto, vsak element vrste vsebuje funkcije in parametre za dostop do tabele
def gen_tasks():
    Naloge = []
    za IP, tbls v TBLES.items():
        cols = re.split('_|-', tbls)
        tblpre = "_".join(cols[:-2])
        min_num = int(cols[-2])
        max_num = int(cols[-1])
        za num v območju(min_num, max_num+1):
            tasks.append(
               (query_do_something, ip, 'your_dbname', '{}_{}'.format(tblpre, num))
            )

    random.shuffle(naloge)
    Povratne naloge

# Zaženi vrsto SQL zahtevkov za dostop v serijah
def run_tasks(naloge, batch_len):
    Poskusi:
        za idx v območju(0, len(tasks), batch_len):
            batch_tasks = naloge[idx:idx+batch_len]
            logging.info("trenutna serija, start_idx:%s len:%s" % (idx, len(batch_tasks)))
            za i v območju(0, len(batch_tasks)):
                l = batch_tasks
                batch_tasks= asyncio.ensure_future(
                    l[0](*l[1:])
                )
            loop.run_until_complete(asyncio.gather(*batch_tasks))
    razen izjeme kot e:
        log.warn(e)

# glavna metoda, ki izvaja asinhrone klice funkcij preko asyncio
def main():
    zanka = asyncio.get_event_loop()

    naloge = gen_tasks()
    batch_len = len(TBLES.keys()) * 5 # vse je odvisno od tebe
    run_tasks(naloge, batch_len)

    loop.close()





Prejšnji:Kako se napolniti.
Naslednji:WebAPI prilagaja format povratnih podatkov
Objavljeno na 30. 11. 2017 09:03:52 |
Dobra podatkovna baza za spooling in optimizacijo tabel
Objavljeno na 4. 04. 2018 15:20:12 |
Na primer
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com