Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 15907|Odpowiedź: 2

[Źródło] python3 implementuje poziome tablice podziału z dostępem współbieżnym

[Skopiuj link]
Opublikowano 29.11.2017 21:15:55 | | |
Opis scenariusza

Załóżmy, że istnieje tabela mysql pokrojona poziomo, rozproszona na wielu hostach, z których każdy ma n tabel podzielonych na fragmenty.
Co powinienem zrobić, jeśli muszę jednocześnie uzyskać dostęp do tych tabel i szybko uzyskać wyniki zapytania?
Oto rozwiązanie implementujące ten wymóg przy użyciu biblioteki asyncio asyncio oraz asynchronicznej biblioteki aiomysql w python3.

Demo kodu

Importowanie
importuj losowo
import asyncio
Z aiomysql import create_pool

# Załóżmy, że tabela mysql jest rozłożona na 8 hostów, z których każdy ma 16 podtabel
TBLES = {
    "192.168.1.01": "table_000-015", #000-015 wskazuje, że wskazanie pod tym IP jest ciągłe 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"

# funkcja owijania do łapania wyjątków
Def query_wrapper(FUNC):
    Async def wrapper (*args, **kwargs):
        Spróbuj:
            Czekaj na func(*args, **kwargs)
        z wyjątkiem Wyjątku jako e:
            Print(e)
    Owijacz zwrotny


# Rzeczywista funkcja obsługi dostępu SQL implementuje asynchroniczne żądania nieblokujące za pomocą AIOMYSQL
@query_wrapper
Async Def query_do_something(IP, DB, tabela):
    asynchronicznie z create_pool(host=IP, db=db, user=USER, password=PASSWD) jako pulą:
        Async z pool.get() jako conn:
            Async z conn.cursor() jako cur:
                sql = ("wybierz xxx z {} gdzie xxxx")
                await cur.execute(sql.format(table))
                res = await cur.fetchall()
                # To zrób coś...


# Wygeneruj kolejkę dostępu do SQL, każdy element tej kolejki zawiera funkcje i parametry umożliwiające dostęp do tabeli
def gen_tasks():
    Zadania = []
    dla IP, tbls w TBLES.items():
        cols = re.split('_|-', tbls)
        tblpre = "_".join(cols[:-2])
        min_num = int(cols[-2])
        max_num = int(cols[-1])
        dla numeru w zasięgu (min_num, max_num+1):
            tasks.append(
               (query_do_something, ip, 'your_dbname', '{}_{}'.format(tblpre, num))
            )

    random.shuffle(tasks)
    Zadania powrotne

# Uruchamiaj kolejkę żądań dostępu SQL w partiach
Def run_tasks(zadania, batch_len):
    Spróbuj:
        dla idx w zakresie (0, len(tasks), batch_len):
            batch_tasks = zadania[idx:idx+batch_len]
            logging.info("aktualna partia, start_idx:%s len:%s" % (idx, len(batch_tasks)))
            dla i w zakresie(0, len(batch_tasks)):
                l = batch_tasks
                batch_tasks= asyncio.ensure_future(
                    l[0](*l[1:])
                )
            loop.run_until_complete(asyncio.gather(*batch_tasks))
    z wyjątkiem Wyjątku jako e:
        log.warn(e)

# główna metoda, która realizuje asynchroniczne wywołania funkcji poprzez asynchronię
def main():
    loop = asyncio.get_event_loop()

    Zadania = gen_tasks()
    batch_len = len(TBLES.keys()) * 5 # wszystko zależy od ciebie
    run_tasks(zadania, batch_len)

    loop.close()





Poprzedni:Jak się naładować.
Następny:WebAPI dostosowuje format danych zwrotnych
Opublikowano 30.11.2017 09:03:52 |
Dobra baza danych do spoolingu i optymalizacji tabel
Opublikowano 04.04.2018 15:20:12 |
Na przykład
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com