程式在等東西完成怎麼辦?別盲等,持續檢查直到完成
你的程式需要等 API 回應、等部署完成、等轉檔結束。盲等 60 秒可能太長也可能太短。poll_until 每秒問一次「好了嗎?」——永遠在最快的時機繼續。
普桑《劫掠薩賓婦女》(The Abduction of the Sabine Women),約 1633–34 年。尼古拉・普桑(Nicolas Poussin)以古羅馬傳說為題,描繪羅穆盧斯舉手發號施令的瞬間,場面中每個人物都在同時行動與回應。現藏於紐約大都會藝術博物館。
你叫了外送,設 60 分鐘鬧鐘再下樓拿。結果 30 分鐘就到了——飯涼了。或者 60 分鐘到了下樓一看——根本還沒到。程式裡的 sleep 60 就是這個情境:盲等一個固定時間,太長浪費、太短出錯。
poll_until 是另一種等法:每分鐘刷一次手機通知,看到「已送達」立刻下樓。永遠在最快的時間拿到最熱的飯。
sleep vs poll_until
# 盲等(可能太長也可能太短)
sleep 60 && check_status
# 持續檢查(永遠在最快時機繼續)
while true; do
status=$(check_status)
if [ "$status" = "ready" ]; then break; fi
sleep 1
done
| 情境 | sleep 60 | poll_until |
|---|---|---|
| 5 秒就好了 | 多等 55 秒 | 5 秒就走 |
| 120 秒才好 | 60 秒時誤判完成 | 120 秒正確完成 |
| 使用者感受 | 「不知道在幹嘛」 | 「它在做,做到哪了」 |
三個層次的使用者體驗
| 實作方式 | 使用者感受 |
|---|---|
sleep 60(盲等) | 「不知道在幹嘛,只能等」 |
poll_until(不顯示進度) | 「至少完成時會通知我」 |
poll_until + 進度顯示 | 「我知道它做到哪了」 |
第三種就是 Netflix 的進度條(18 分鐘 / 56 分鐘):系統持續檢查「目前到哪」,即時顯示。差別不在技術,在有沒有讓等待的人知道現在的狀態。
我的追問與發現
「我用 Claude Code 本來就是這種情境啊,這段是在講什麼?」
對,作為使用者你已經在享受 poll_until 了(Agent 完成會通知你)。這段的價值在於你自己建系統的時候。四個實際場景:部署後每 5 秒 curl 檢查是否 200、語音轉文字進度條即時更新、挫折飛輪排行榜掃描完成推送、客戶面前 demo 顯示「分析第 3/10 頁」取代尷尬沉默。
「所以 poll_until 的本質不是技術?」
是溝通設計。sleep 是對使用者說「你等著」。poll_until 是說「我會隨時告訴你進度」。這跟誠實介面的精神一樣——讓使用者隨時知道系統的狀態,不隱瞞、不讓人猜。
你可以怎麼用
- 部署後:不要盲等 2 分鐘,寫個 poll 每 5 秒 curl 你的網站,回 200 就通知自己
- 任何「處理中」的 UI:加進度條或至少加一句「正在處理…」,不要讓畫面完全靜止
- 批次任務:跑 10 個檔案轉檔,顯示「3/10 完成」而不是「處理中請稍候」
- 一個原則:任何讓使用者等超過 3 秒的操作,都該有進度回饋
延伸連結
一句話帶走
sleep 是對使用者說「你等著」。poll_until 是說「我隨時告訴你進度」。差別不在技術,在尊重。
📚 完整學習對話紀錄(想看完整脈絡可展開)
原文(蒸餾精華 第 10 段)
兩種等待方式的差距:
# Traditional (slow):
sleep 60 && check_status
# Top-tier (3-5x faster):
while true; do
status=$(check_status)
if [ "$status" = "ready" ]; then break; fi
sleep 1
done
Claude 的白話解釋
程式常常需要「等某件事完成」。等的方式有兩種:
- sleep 60:「我不管你好了沒,60 秒後再看。」——可能白等 50 秒,也可能 60 秒到了還沒好。
- poll_until:「我每 1 秒問一次:好了嗎?好了嗎?好了嗎?……好了!走。」——永遠在最快的時機繼續,而且一定正確。
日常比喻:sleep 就像叫外送後設一個 60 分鐘的鬧鐘再下樓拿(可能冷掉了)。poll_until 就像每隔一分鐘刷一次手機通知,一看到「已送達」立刻下樓(永遠在最快的時間拿到熱的)。
我的提問:我用 Claude Code CLI 時本來就是這種情境,這段提醒的是自建 AI 系統時的通報機制嗎?
這段讀完我的第一反應是:我每天用 Claude Code 已經在體驗 poll_until 了。我送出指令,Claude 在背景跑,完成後通知我。我不需要盲等 60 秒,也不需要自己寫 while 迴圈。
所以我追問了:除了 CLI 這種已經幫我做好的情境,還有什麼場景是我「自己」需要寫 poll_until 的?
Claude 的回答:四個你的實際工作場景
- 部署後健康檢查:git push → 每 5 秒 poll → 收到 200 回應 = 部署完成
- 語音轉文字:30 分鐘錄音處理 → 每 3 秒查進度 → 進度條更新
- 挫折飛輪排行榜:AI 掃描 log → poll 完成狀態 → 完成後推送
- 客戶面前 demo:AI 生成報告 → 畫面顯示「正在分析第 3 頁 / 共 10 頁…」
Claude 的更深層分析:poll_until 不只是技術,是溝通設計
| 實作方式 | 使用者感受 |
|---|---|
| sleep 60 | 「不知道在幹嘛,只能等」 |
| poll_until(不顯示進度) | 「至少完成時會通知我」 |
| poll_until + 進度顯示 | 「我知道它在做什麼,做到哪了」 |
第三個層次就是 Netflix 的進度條(18 分 / 56 分)。它的本質就是 poll_until 的視覺化。
我學到的
sleep 是對使用者說「你等著」。poll_until 是對使用者說「我會隨時告訴你進度」。差別不在技術,在尊重。