Pythonでasyncioを使ってみる

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

コメント

タイトルとURLをコピーしました