繁体   English   中英

使用 pd.read_sql 和 asyncio 从数据库读取

[英]Read from database using pd.read_sql and asyncio

我有三个表,每个表大约需要 1 分钟来查询(即总共 3 分钟),就像这样

from my_utils import get_engine
import pandas as pd

def main():
   con1 = get_engine("table1")
   con2 = get_engine("table2")
   con3 = get_engine("table3")

   df1 = pd.read_sql(query1,con=con1)
   df2 = pd.read_sql(query2,con=con2)
   df3 = pd.read_sql(query3,con=con3)

main()

这让天空“异步”。

因此,我尝试了以下操作(我对使用asyncioasyncio

.
.
import asyncio

async def get_df1(query1):
   df1 = pd.read_sql(query1,con=con1)
   return df1

async def get_df2(query2):
   df2 = pd.read_sql(query2,con=con2)
   return df2

async def get_df3(query3):
   df3 = pd.read_sql(query3,con=con3)
   return df3

async def main():

 df1,df2,df3 = await asyncio.gather(get_df1(),get_df2(),get_df3())

asyncio.run(main())

它运行,但它需要与同步运行完全相同的时间。

我错过了什么吗?

协程之间的切换仅发生在await语句中,并且由于您的get_df函数中没有awaitget_df您的三个查询将仅按顺序执行。 由于pd.read_sql不是本机异步的,因此您必须使用执行程序将其包装起来以制作异步版本:

async def read_sql_async(stmt, con):
    loop = asyncio.get_event_loop()
    return await loop.run_in_executor(None, pd.read_sql, stmt, con)

然后,您将能够将read_sql作为等待运行:

df1 = await read_sql_async(query1, con=con1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM