使 pandas 函数异步

Making a pandas function asynchronous

考虑以下代码段。

import asyncio

import pandas as pd


# @asyncio.coroutine
async def read(some_id):
    '''
    '''
    # await ?, yield ?, yield from ?
    return pd.read_sql_query(f'''SELECT * FROM some_table WHERE id={some_id}''',
                                con) # how do I make this line awaitable.

我希望能够实现该功能 awaitable 以便我可以在数组中传递 id 并同时开始查询,因为读取 table 需要很多时间,比如.

async def main():
    '''
    '''
    alltasks = []
    for some_id in [3, 2, 5]:
        task = asyncio.create_task(read(some_id))
        alltasks.append(task)
    res = await asyncio.gather(*alltasks)

现在这会同步执行查询,因为我的函数不是真正的异步,那么如何让它真正异步。 我知道我可以使用 asycio.sleep(0) 但这不会执行查询,我如何在不使用 concurrent.future.ThreadPoolExecutor 的情况下实现这一点,就像在其他答案中一样。

感谢您的帮助,谢谢。

您可以通过 asyncio.to_thread():

将任何常规函数转换为可等待的协程
def read(some_id): # note: no await!
    return pd.read_sql_query(...)

async def main():
    tasks = [asyncio.to_thread(read, some_id) for some_id in [3, 2, 5]]
    res = await asyncio.gather(*tasks)

asyncio.run(main())