代码之家  ›  专栏  ›  技术社区  ›  Alexander

python 3.6异步aioodbc阻塞

  •  1
  • Alexander  · 技术社区  · 7 年前

    我希望将aioodbc与异步信号一起用于将行插入数据库。下面将向目标数据库中写入一些行,但似乎在sempahore周围锁定。 value + 1。关于如何重新编写这个或解决块/争用的任何建议?

    表定义:

    create table async_testing (
        insert_id int null
    )
    

    异步代码:

    import asyncio
    import aioodbc
    
    loop = asyncio.get_event_loop()
    
    async def odbc_insert_worker(semaphore, value, conn):
        await semaphore.acquire()
        print("Acquire Semaphore")
        async with conn.cursor() as cur:
            await cur.execute('INSERT INTO async_testing VALUES (?)', value)
        print("Release Semaphore")
        semaphore.release()
    
    async def db_main(loop, values):
        dsn="foo"
    
        values = list(values)
        db_semaphore = asyncio.Semaphore(value=15)
    
        async with aioodbc.create_pool(dsn=dsn, loop=loop, autocommit=True) as pool:
            async with pool.acquire() as conn:
                tasks = [odbc_insert_worker(db_semaphore, value, conn) for value in values]
                await asyncio.gather(*tasks)
    
    fmt_vals = range(0,1000)
    
    loop.run_until_complete(db_main(loop, fmt_vals))
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Alexander    7 年前

    import asyncio
    import aioodbc
    from concurrent.futures import ThreadPoolExecutor
    
    loop = asyncio.get_event_loop()
    
    async def odbc_insert_worker(conn, value):
        async with conn.cursor() as cur:
            await cur.execute('insert into async_testing values (?)', value)
    
    async def db_main(loop, values):
        dsn="foo"
    
        values = list(values)
    
        async with aioodbc.create_pool(dsn=dsn, loop=loop, executor=ThreadPoolExecutor(max_workers=3), autocommit=True) as pool:
            tasks = [do_insert(pool, value) for value in values]
            await asyncio.gather(*tasks)
    
    async def do_insert(pool, value):
        async with pool.acquire() as conn:
            await odbc_insert_worker(conn, value)
    
    fmt_vals = range(0,1000)
    
    loop.run_until_complete(db_main(loop, fmt_vals))