Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
非同期タスクキューを使って業務を自動化しまくった話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Hiroshi Sano
December 15, 2023
Technology
1.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
非同期タスクキューを使って業務を自動化しまくった話
はんなりプログラミング: 1年の締めくくり!2023年にチャレンジしたことのLT祭
Hiroshi Sano
December 15, 2023
More Decks by Hiroshi Sano
See All by Hiroshi Sano
調整さんの調整結果をカレンダーへ登録するGPTsを作った話
hrsano645
1
760
Gmail APIでメールを扱おうとしたら結構辛かった話
hrsano645
0
550
非同期タスクキューを使って業務効率化した話
hrsano645
1
1.5k
ご当地グルメマップを作ろう
hrsano645
2
1.5k
Python駿河 #28 富士宮焼きそばを食べ歩きしたいのでマップを作った話
hrsano645
0
140
Python駿河 #1 MicroPythonを使ってみよう!
hrsano645
0
1.2k
IoTLT vol.51 お風呂IoT Mk2作りました
hrsano645
1
2k
IoTLT vol.46 蛇口IoTに挑戦した記録
hrsano645
1
1.1k
PWA入門してみた話(iPad Proで!)
hrsano645
1
1.1k
Other Decks in Technology
See All in Technology
IR Today: Theory, Practice, and Agents
dtunkelang
0
210
企業の現実世界をグラフで写し取る
sansantech
PRO
0
170
AIは推し活である。
kurazuuuuuu
2
1k
サーバーレスをどこまで使う? WebRTC対戦ゲームで選んだVPSとの共存設計
kaidouji85
0
480
Cloudflare Workers 向けアプリを C# で構築する ~WASM Native AOT への道~
nenonaninu
1
1.8k
3人で1000GPU超を統合運用する?マルチクラウド&オンプレを跨ぐ、構築と運用のリアル!
kazukun0716
2
680
AIエージェントを安全で速い現場監督にする:Jev・Obsidian・メタハーネス
x5gtrn
PRO
0
140
HacobuにおけるFDEとは/登壇資料(戸井田 裕貴)
hacobu
PRO
1
160
GoのInterface内部構造から学ぶ!最高パフォーマンスを出すコード設計
yappli_developers
1
300
Terraformを用いたJamf Pro構成のIaC, GitOps化への挑戦
yukun
0
110
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
280
AI感のないAWS構成図をAIエージェントに描かせたい!
sagochiko
2
470
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7.2k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
250
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
480
Joys of Absence: A Defence of Solitary Play
codingconduct
1
530
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
2k
Darren the Foodie - Storyboard
khoart
PRO
4
4k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Transcript
非同期タスクキューを使って業務を自動化しまくった話 はんなりプログラミング: 1年の締めくくり!2023年にチャレンジしたことのLT祭 2023-12-15 佐野 浩士 @hrsano645 1
お前誰よ / Self Introduction 佐野 浩士(Hiroshi Sano)@hrs_sano645 : 静岡県富士市 :
株式会社佐野設計事務所 CEO : PyCon mini Shizuoka Stuff / Shizuoka.py / Unagi.py / Python駿河 CivicTech, Startup Weekend Organizer Hobby: Camp ,DIY ,IoT 2
3
2023年の本業の話 4
目標: 業務の効率化を限界まで進める 5
業務自動化ガッツリやりました 依頼ベースの案件業務 今まではそれほど多くなかったが今年になって急激に増える 人力でやっていては追いつかなそうでやばい 人が必要な部分以外人力でやるのを止める! -> 止めることに成功した!! 6
こんな絵を想像して 7
業務タスク自動化サービスの構成 8
どんなことを効率化? 自動生成 依頼受注(メール)→ボイラープレートツールで作業プロジェクト フォルダーを生成 スケジュール管理→Googleスプレッドシート連携 会計サービスと連携して見積書/請求書生成(書類作成) 依頼企業側のシステム連携: WEBスクレイピング タスク操作をChatOps Google
Chatでチャットボット作成 過去の依頼からサマリー情報のデータベース化: (現在取り組み中) 始まりと終わりを自動化することで、中身の作業に集中できるような体制 9
自動生成の部分を非同期タスクキューを使って作業させています 10
なんで非同期にしたの? これらは重い処理: ファイル操作、APIアクセス -> I/Oバウンド処理 組み合わせると数秒ではなく数十秒〜分単位の処理 結果が返ってくるタイミングはその時次第 同期処理でやると、処理が終わるまで待たされる -> ブロッキング処理
チャットボット側がロックされてしまう->応答が返せない 基本チャットボットは非同期前提 11
Google Chatの場合 「同期的に応答するには、Chat アプリが 30 秒以内に応答し、その応答をインタラクシ ョンが発生したスペースに投稿する必要があります。それ以外の場合は、Chat アプリは 非同期で応答できます。」 https://developers.google.com/chat/api/guides/message-formats?hl=ja#sync-
response (Slackの3秒よりも全然緩いけど、非同期前提な様子) 12
非同期とは 同期処理と非同期処理の違い: 処理のオフロードと並列処理が可能。処理の待ち時間を有効活用できる チャットボットのために非同期処理を使うことになる: これが結局制約あるため ノンブロッキング処理: 処理が終わるまで待たされない(チャットの場合、応答が素早く 返せる) 13
Pythonでの非同期処理の選択肢 標準ライブラリ:(並列)threading,(並列)multiprocessing, (非同期)asyncio,(並列?3.12から)sub-interpreters メッセージキュー活用: celery, rq, pyzmq(ZeroMQ) クラウドのメッセージング: Cloud Pub/Sub(イベントベースで
etc... 14
今回はRQ(python-rq)を使いました python-rq: https://python-rq.org/ 以下の3つの要素で構成される アプリ: タスク発行→キューへ入れる→ワーカーから処理結果を受け取る ワーカー: タスクの処理を行う redis: アプリとワーカーの間に入りキューとして利用する
15
非同期タスクのざっくりイメージ 16
なぜRQを選んだのか ドキュメント見ていたら利用しやすいシンプルさが良かった asyncioと悩んだ -> RQがシンプルにできそうだった celeryと悩んだ -> celeryを使うほどの規模ではなかったと思う ※ I/Oバウンズ処理はasyncio,
multiprocessingは制限にならないので、 この選択肢がベストとは限らない(速度とか) ※ redisの扱いに慣れたくて使いたかったという意味も バウンドとは制限という意味 17
注意 RQはWindowsは非対応 WSLなら動かせる -> https://python-rq.org/docs/#limitations 今回はdockerで動かす例です チャットボットも動かすのでどうせならLinux系がお手軽 18
ということで、ちょっぱやでDocckerで用意する場合の例 参考: Python で分散タスクキュー (RQ 編) #Python - Qiita @hoto17296
19
Dockerfile FROM python:3.11 RUN pip install rq 20
compose.yml version: '3' services: redis: image: redis worker: build: .
depends_on: - redis environment: RQ_REDIS_URL: redis://redis command: rq worker volumes: - .:/app working_dir: /app app: build: . depends_on: - redis - worker environment: RQ_REDIS_URL: redis://redis command: python app.py volumes: - .:/app working_dir: /app 21
簡単なサンプル: printしてみる tasks.py import logging logger = logging.getLogger(__name__) def add(a,
b): logger.debug("{} + {} = {}".format(a, b, a + b)) return a + b 22
app.py import os from time import sleep import redis from
rq import Queue from tasks import add q = Queue(connection=redis.from_url(os.environ.get("RQ_REDIS_URL"))) # 10 個のタスクの実行をキューに投げる tasks = [q.enqueue(add, args=(i, 1)) for i in range(10)] # タスク実行が完了するまで少し待つ sleep(1) # 結果を出力する print([task.result for task in tasks]) 23
実行 # シングルワーカー $ docker-compose up # マルチワーカー: 4 つのワーカーを起動
$ docker-compose up --scale worker=4 ## ログは別途ファイルでみせます 24
dockerで動かす時 RQはredis(キュー)へタスクを渡すときはpickleを使ってる ワーカー側でもpickleで渡されたオブジェクトが理解できないといけない -> ワーカー側にも同じライブラリをインストールする必要がある 手っ取り早い方法として タスク側もワーカー側も同じ環境=Dockerfileを使う コード参照や利用するボリュームも同じ箇所を参照すると楽 タスクとワーカーを同時に動かすならcomposeが便利 25
まとめ 膨大な退屈なこと手作業は間違えるので自動化しよう 自動化は重い処理をよく扱う->非同期前提で考える 非同期タスクキューを使うことで、重い処理を任せられ 自動化の幅や連携方法が広がる(はず Google Chatアプリの話はまたどこかで〜 26
参考 メッセージキュー - Wikipedia python-rq 【Pythonで高速化】I / Oバウンドとか並列処理とかマルチプロセスとかってなんぞや #Python -
Qiita docker利用時の参考: Python で分散タスクキュー (RQ 編) #Python - Qiita Python3.12で新たにサポートされたsub-interpretersの紹介 | gihyo.jp サンプルコード https://github.com/hrsano645/exam-python-rq-by-docker 27
Google Chatと合わせる時 チャットボット側で操作をする -> タスクをキューに入れる チャットボット側に応答をする ワーカー側でタスクを実行する ワーカー側でチャット側に非同期で応答を返す Google ChatならGoogle
Chat REST APIで非同期応答できる 28
29