サーバレス練習帳

着眼大局着手小局

pythonの非同期処理

https://note.com/cz_investment_ch/n/na3fa924ecf92

このコードが参考になるかな。
dev.classmethod.jp

・・・ということで、ChatGPTに聞いてみた。

Pythonで非同期処理を行い、複数のタスクから最初に終了したものの結果で処理を終了させたい場合は、asyncioライブラリを使用してasyncio.wait関数のreturn_whenパラメータをasyncio.FIRST_COMPLETEDに設定すると実現できます。
以下は、asyncioを使って3つの非同期タスクを実行し、どれか一つが終わった時点で全体の処理を終了させる例です。
import asyncio

# 非同期で実行するタスク
async def task(name, seconds):
await asyncio.sleep(seconds)
print(f"{name} finished after {seconds} seconds")
return name

# 最初に終了したタスクの結果で処理を終了する関数
async def main():
# それぞれ異なる時間を待機するタスクを定義
t1 = task("タスク1", 3)
t2 = task("タスク2", 1)
t3 = task("タスク3", 2)

# asyncio.waitで非同期にタスクを待つ
done, pending = await asyncio.wait(
{t1, t2, t3},
return_when=asyncio.FIRST_COMPLETED # 最初に終了したタスクを待つ
)

# 完了したタスクの情報を処理
for task in done:
result = await task
print(f"結果: {result}")

# 他のタスクをキャンセル
for task in pending:
task.cancel()

# 非同期処理を実行
asyncio.run(main())

このコードでは、異なる秒数で完了する3つのタスクを同時に開始します。asyncio.waitがFIRST_COMPLETEDで最初に完了したタスクを待ち、結果を出力した後、残りの未完了のタスクをキャンセルします。
注意: Python 3.7 以降でasyncio.run関数を使っています。それより前のバージョンを使っている場合は、イベントループを手動で管理する必要があります。また、非同期処理ではグローバル解釈ロック(GIL)による影響を受けにくいため、マルチスレッドに比べて効率的な場合がありますが、IOバウンド処理向けです。計算密度の高い処理でのパフォーマンス向上は見込めません。

HTMLでテーブルのソートとページング

軽量なjsでソート
https://qiita.com/riversun/items/8c59353af4f16264aedd


もしくは、cdn方式でこれをそのまま使わせて頂くか。ページングも含まれているらしい。検索もあるようだ。

https://appsol-one.com/ui/bootgrid/

boitastrap datatable

https://be-engineer.jp/programming/506/

jQueryのbootgrid
https://nesabi.net/jquery-bootgrid

UUIDと、時間ソート可能なULID

ULIDが便利そう
qiita.com

Lambdaレイヤーにulid-pyがあると良いなぁ。

pip install ulid-py

qiita.com

なんかライブラリたくさんあるらしい。

https://yu00sasaki.com/tips/ulid/

cuidというのもあるらしい

https://www.keisuke69.net/entry/2022/08/01/140656

こんな感じで動かせた。

    import ulid
    import datetime

    session_id = ulid.new().str

    id1 = ulid.new()
    print(id1)
    print(id1.str)
    DIFF_JST_FROM_UTC = 9
    print(id1.timestamp().datetime)
    id1j=id1.timestamp().datetime + datetime.timedelta(hours=DIFF_JST_FROM_UTC)
    print(id1j)
    print(id1j.strftime('%Y%m%d%H%M%S'))

01HRW2NCJWX5T26THASQZQ1GFT
01HRW2NCJWX5T26THASQZQ1GFT
2024-03-13 14:15:06.076000+00:00
2024-03-13 23:15:06.076000+00:00
20240313231506

きちんと、最後は日本時間になっています!良いね!

ちなみに、AWS Lambda/python3.9/x86の上で動かしているのですが、
ulid-pyのlambda layerは、m2mac(arm)のpython3.9上で作成した。
けど、普通に動いている。
psycopg2みたいなOSに近しい機能を持ったミドルウェアでなければ、
x86でもarmでもどちらでも動くんだろうな。