asyncとかawaitとか使っていい感じにやると、IOバウンドな処理は速くなる。
from __future__ import annotations
import asyncio
import pandas as pd
import psycopg2
# RedShift とかからデータを取ってくる例
# annotation がこれでよいかは謎
async def fetch_data() -> pd.DataFrame:
loop = asyncio.get_event_loop()
with open('path/to/query.sql', 'r') as f:
query = f.read()
with psycopg2.connect('hoge') as con:
df = await loop.run_in_executor(None, pd.read_sql, query, con)
return df
loop = asyncio.get_event_loop()
coros = [fetch_data(), fetch_log_data()]
gather = asyncio.gather(*coros)
df1, df2 = loop.run_until_complete(gather)
# あまり使わないかもしれないが、1つの処理をやるときは
df = loop.run_until_complete(fetch_data())
なお、notebook でやるときは以下が必要
import nest_asyncio
nest_asyncio.apply()
さもないと、以下のエラーが出る
RuntimeError: This event loop is already running
コメント