Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 15907|Respuesta: 2

[Fuente] Python3 implementa tablas de particionamiento horizontal de acceso concurrente

[Copiar enlace]
Publicado en 29/11/2017 21:15:55 | | |
Descripción del escenario

Supongamos que existe una tabla mysql que se divide horizontalmente, distribuida entre múltiples hosts, cada uno con n tablas fragmentadas.
¿Qué debo hacer si necesito acceder a estas tablas simultáneamente y obtener los resultados de la consulta rápidamente?
Aquí tienes una solución para implementar este requisito usando la biblioteca asyncio asyncio y la biblioteca asynchrona aiomysql de python3.

Demo de código

Registro de importaciones
importar aleatorio
importar asincro
De AioMySQL Import create_pool

# Supongamos que la tabla mysql está distribuida en 8 hosts, cada uno con 16 sub-tablas
TBLES = {
    "192.168.1.01": "table_000-015", #000-015 indica que la indicación bajo esta IP es continua de 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",
}
USUARIO = "xxx"
PASSWD = "xxxx"

# función de envoltura para detectar excepciones
def query_wrapper(función):
    envoltorio de defensa asíncrona (*args, **kwargs):
        Prueba:
            await func(*args, **kwargs)
        excepto la excepción como e:
            Impreso(e)
    Envolvente de devolución


# La función real de gestión de acceso SQL implementa solicitudes asíncronas no bloqueantes a través de AIOMYSQL
@query_wrapper
Defensa asíncrona query_do_something(IP, DB, tabla):
    async con create_pool(host=ip, db=db, user=USER, password=PASSWD) como pool:
        async con pool.get() como conn:
            async con conn.cursor() como cur:
                SQL = ("seleccionar xxx de {} donde xxxx")
                await cur.execute(sql.format(table))
                res = await cur.fetchall()
                # Entonces haz algo...


# Genera una cola de acceso SQL, cada elemento de la cola contiene funciones y parámetros para acceder a una tabla
def gen_tasks():
    Tareas = []
    para IP, tbls en TBLES.items():
        COLS = re.split('_|-', TBL)
        tblpre = "_".join(cols[:-2])
        min_num = int(cols[-2])
        max_num = int(cols[-1])
        para num en el rango(min_num, max_num+1):
            tasks.append(
               (query_do_something, IP, 'your_dbname', '{}_{}'.format(tblpre, num))
            )

    aleatorio.shuffle(tareas)
    Tareas de retorno

# Ejecutar la cola de solicitudes de acceso SQL en lotes
Def run_tasks(tareas, batch_len):
    Prueba:
        Para IDX en rango (0, LEN(tareas), batch_len):
            batch_tasks = tareas[idx:idx+batch_len]
            logging.info("actual lote, start_idx:%s len:%s" % (idx, len(batch_tasks)))
            para i en rango(0, len(batch_tasks)):
                l = batch_tasks
                batch_tasks= asyncio.ensure_future(
                    l[0](*l[1:])
                )
            loop.run_until_complete(asyncio.gather(*batch_tasks))
    excepto la excepción como e:
        Tala. advertencia(e)

# método principal, que implementa una llamada asíncrona de funciones a través de asíncronos
def main():
    bucle = asyncio.get_event_loop()

    tareas = gen_tasks()
    batch_len = len(TBLES.keys()) * 5 # todo depende de ti
    run_tasks(tareas, batch_len)

    loop.close()





Anterior:Cómo recargar energías.
Próximo:WebAPI personaliza el formato de los datos de retorno
Publicado en 30/11/2017 9:03:52 |
Buena base de datos de spooling y optimización de tablas
Publicado en 4/4/2018 15:20:12 |
Como
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com