指數(shù)退避輪詢器與統(tǒng)一Job歸一化設(shè)計(jì)原理)
【免費(fèi)下載鏈接】ade-pythonPython library for Agentic Document Extraction (ADE).項(xiàng)目地址https://gitcode.com/gh_mirrors/ade/ade-python點(diǎn)擊查看免費(fèi)下載ade-python 是 LandingAI Agentic Document ExtractionADE平臺(tái)的官方 Python SDK能把 PDF、圖片解析為結(jié)構(gòu)化 Markdown再按 JSON Schema 或 Pydantic 模型抽取類型化字段。當(dāng)處理大文檔必須走異步 Job 輪詢模式時(shí)SDK 用了一個(gè)精心設(shè)計(jì)的wait()指數(shù)退避輪詢器和一套統(tǒng)一 Job 歸一化層。本文帶你讀懂這兩個(gè)核心機(jī)制的設(shè)計(jì)原理。為什么需要 wait()同步與異步 Job 的邊界ade-python 的 V2 接口把文檔處理分成兩條路徑場(chǎng)景接口行為小文檔client.v2.parse/client.v2.extract同步返回結(jié)果超時(shí)返回 HTTP 504 并拋V2SyncTimeoutError大文檔parse_jobs/extract_jobs等 Job 資源先create拿到j(luò)ob_id再輪詢直到任務(wù)結(jié)束同步路徑遇到長(zhǎng)文檔會(huì)被服務(wù)端取消所以大文件必須走 Job 資源。而輪詢一個(gè)遠(yuǎn)程任務(wù)直到它結(jié)束是個(gè)經(jīng)典難題輪詢太密會(huì)打爆服務(wù)端太稀又會(huì)白白拖慢響應(yīng)。ade-python 的解法藏在 src/landingai_ade/resources/v2/_base.py 里。wait()指數(shù)退避輪詢器四個(gè)常量與一個(gè)核心函數(shù)四個(gè)默認(rèn)參數(shù)定義了輪詢節(jié)奏在 _base.py 頂部四個(gè)常量完整刻畫了退避策略常量默認(rèn)值含義DEFAULT_POLL_INITIAL1.0 秒首次輪詢前的等待時(shí)間DEFAULT_POLL_FACTOR1.5每輪等待時(shí)長(zhǎng)乘以 1.5DEFAULT_POLL_MAX10.0 秒等待時(shí)長(zhǎng)上限封頂DEFAULT_WAIT_TIMEOUT600 秒wait()總超時(shí)超時(shí)拋JobWaitTimeoutError也就是說(shuō)等待序列是 1s → 1.5s → 2.25s → 3.38s → … → 10s封頂。任務(wù)剛提交時(shí)狀態(tài)變化最快高頻輪詢能盡早拿到結(jié)果時(shí)間拉長(zhǎng)后逐漸放手把壓力降到最低。用戶也可以傳入poll_interval直接鎖定固定間隔退避隨即失效——兩種策略都保留給了調(diào)用方。核心輪詢循環(huán)先查狀態(tài)再看時(shí)間真正的輪詢邏輯在 poll_until_terminal同步版和 apoll_until_terminal異步版中循環(huán)語(yǔ)義非常直白調(diào)get_job()拉取最新狀態(tài)若job.is_terminal為真completed/failed/cancelled立即返回若已過(guò) deadline拋JobWaitTimeoutError否則睡眠min(delay, 距 deadline 剩余時(shí)間)后進(jìn)入下一輪。第 4 步的min()是個(gè)容易被忽略的細(xì)節(jié)最后一次睡眠絕不會(huì)跨過(guò) deadline避免了明明超時(shí)了還白睡滿一整段的浪費(fèi)。兩個(gè)失敗分支由 lib/v2_errors.py 區(qū)分得很干凈JobWaitTimeoutError等待超時(shí)任務(wù)在服務(wù)端仍在運(yùn)行稍后可以用get(job_id)繼續(xù)查JobFailedError任務(wù)以failed/cancelled終態(tài)結(jié)束且調(diào)用方傳了raise_on_failureTrue。默認(rèn)不拋方便調(diào)用方自行判斷終態(tài)??勺⑷氲臅r(shí)鐘測(cè)試不睡真時(shí)間poll_until_terminal不直接讀time而是把monotonic和sleep作為參數(shù)注入——生產(chǎn)環(huán)境傳time.monotonic/time.sleep測(cè)試則注入假時(shí)鐘。tests/test_v2_waiter.py 里的FakeClock正是利用這個(gè)測(cè)試縫隙零真實(shí)耗時(shí)即可斷言退避序列恰好是[1.0, 1.5]、超時(shí)必拋、失敗分支行為正確。對(duì)輪詢器這類時(shí)序敏感的代碼這是非常值得學(xué)習(xí)的可測(cè)試性設(shè)計(jì)。異步版只是把阻塞睡眠換成anyio.sleep狀態(tài)機(jī)完全一致因此同步/異步客戶端的wait()行為嚴(yán)格對(duì)齊見 parse.py 與 L503-L519 的鏡像實(shí)現(xiàn)。parse_jobs、extract_jobs、build_schema_jobs三組 Job 資源復(fù)用同一套輪詢器wait()的參數(shù)與異常語(yǔ)義處處相同。統(tǒng)一Job歸一化兩種上游信封一個(gè) Job 形狀上游信封并不統(tǒng)一翻 docs/design/stainless-exit-and-v2.md 的 API 契約一節(jié)會(huì)發(fā)現(xiàn)parse 和 extract 兩條 Job 鏈路的響應(yīng)信封天生不同字段parse jobs 信封extract jobs 信封結(jié)果載荷data舊或result新result失敗信息failure_reasonerror: {code, message}時(shí)間字段started_at/received_atcreated_at/completed_at如果 SDK 原樣透?jìng)饔脩艟偷脼槊總€(gè)端點(diǎn)寫不同的取值代碼。ade-python 選擇在 resources/v2/_normalize.py 做歸一化normalize_parse_job、normalize_extract_job、normalize_build_schema_job三個(gè)函數(shù)把任意信封統(tǒng)一壓進(jìn)同一個(gè) Job 模型。Job 模型類型化字段 raw 兜底types/v2/job.py 中的Job是面向用戶的唯一任務(wù)形狀job_id/status/progress任務(wù)身份與進(jìn)度status是JobStatus枚舉pending、processing、completed、failed、cancelledresult完成后才填充類型隨端點(diǎn)變化parse 任務(wù)是V2ParseResponseextract 任務(wù)是V2ExtractResulterror歸一化后的JobError(code, message)raw原始信封原樣保留任何沒被上浮到類型字段的字段都能從raw里取到is_terminal屬性方法直接回答能否結(jié)束輪詢。類型化字段管常用路徑raw管長(zhǎng)尾需求——既不丟信息也不讓模型變成上帝對(duì)象。寬容歸一化上游漂移不該讓用戶代碼崩潰_normalize.py 里有幾處刻意的寬容處理體現(xiàn)了 SDK 作為上游 API 緩沖層的定位未知狀態(tài)不崩網(wǎng)關(guān)返回未收錄/已改名的 status 時(shí)降級(jí)為PENDING繼續(xù)輪詢?cè)等钥蓮膔aw拿到新舊載荷兼容parse 任務(wù)的結(jié)果可能掛在result也可能掛在舊版data下兩個(gè)鍵都認(rèn)失敗字段雙語(yǔ)error對(duì)象和舊版failure_reason字符串都能歸一成JobError時(shí)間戳雙格式_ts()同時(shí)接受 ISO 字符串和 epoch 整數(shù)解析失敗返回None而非拋錯(cuò)。一句話總結(jié)寧可字段為None也不讓一次上游漂移炸掉整條流水線。list端點(diǎn)則由 JobList 收編它是Job列表的子類額外攜帶has_more、org_id、page、page_size分頁(yè)信封且對(duì)類型不符的值比如字符串false一律拒絕強(qiáng)轉(zhuǎn)防止臟數(shù)據(jù)污染布爾字段。從 create 到 wait三步用上全部設(shè)計(jì)理解了上面的機(jī)制實(shí)際使用非常簡(jiǎn)單完整示例見 README.md 與 examples/v2_smoke_test.pyjob client.v2.parse_jobs.create(documentPath(large_file.pdf)) done client.v2.parse_jobs.wait(job.job_id, timeout600, raise_on_failureTrue) print(done.status, done.result.markdown[:200])指數(shù)退避、deadline 保護(hù)、異常分流、信封歸一化全部在這一行wait()背后自動(dòng)完成。想手動(dòng)控制節(jié)奏也可以改用client.v2.parse_jobs.get(job_id)自輪詢——返回的同樣是歸一化后的Job。小結(jié)兩層抽象一個(gè)穩(wěn)定 APIade-python 的這兩個(gè)設(shè)計(jì)給輪詢型異步 API打了個(gè)很好的樣板輪詢器只有一份poll_until_terminal被三組 Job 資源、同步/異步兩套客戶端共享退避參數(shù)集中可調(diào)測(cè)試用注入時(shí)鐘做到零耗時(shí)驗(yàn)證歸一化層吸收差異上游信封不一致、新舊字段漂移全部在_normalize.py內(nèi)部消化用戶只面對(duì)Job一個(gè)形狀失敗語(yǔ)義明確超時(shí)與業(yè)務(wù)失敗是兩種異常任務(wù)還在跑和任務(wù)壞了從此不再混淆。對(duì)新手來(lái)說(shuō)最值得帶走的是這兩條通用經(jīng)驗(yàn)時(shí)序邏輯把時(shí)鐘/睡眠當(dāng)依賴注入測(cè)試就快且穩(wěn)對(duì)外模型提供類型化字段 原始數(shù)據(jù)兜底API 漂移才不會(huì)傳導(dǎo)到你的代碼里。贊分享【免費(fèi)下載鏈接】ade-pythonPython library for Agentic Document Extraction (ADE).項(xiàng)目地址https://gitcode.com/gh_mirrors/ade/ade-python點(diǎn)擊查看免費(fèi)下載相關(guān)推薦ade-python完整指南如何用異步Jobs和wait()輪詢器輕松搞定大文檔處理ade python完整指南如何用異步Jobs和wait 輪詢器輕松搞定大文檔處理 ade python 是 LandingAI ADEAgentic DoXXL-JOB 執(zhí)行器設(shè)計(jì)與實(shí)現(xiàn)XXL JOB 執(zhí)行器設(shè)計(jì)與實(shí)現(xiàn) XXL JOB 的執(zhí)行器是其分布式任務(wù)調(diào)度框架中的關(guān)鍵組件負(fù)責(zé)接收調(diào)度中心的請(qǐng)求并執(zhí)行具體的任務(wù)邏輯。執(zhí)行器的設(shè)計(jì)充分考慮了任務(wù)調(diào)度后端Composer Low Precision GroupNorm 低精度歸一化算法原理、用法與源碼剖析Composer Low Precision GroupNorm 低精度歸一化算法原理、用法與源碼剖析 導(dǎo)讀 本文圍繞 Composer 訓(xùn)練框架中的 Low深度學(xué)習(xí)分布式訓(xùn)練模型優(yōu)化創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考