使用benjamin-batchly實現Rust非同步批處理 - alexheretic
有時,與其同時做很多小事,不如將它們捆綁在一起,一次完成,作為一個批處理。所以在星期四早上的一個銀行假期裡,我很早就醒了(主要是因為我 1 歲男孩的尖叫聲)並且(在尖叫聲停止後)寫了一個crate 來幫助做到這一點:benjamin_batchly。
示例:插入資料庫
資料庫最佳化的一個反覆出現的主題是減少對資料庫的“旅行”。傳送 1 條包含 N 項的胖訊息通常比傳送 N 條僅包含 1 項的瘦訊息要快。
考慮一個我們想要插入資料庫的 crud 風格的建立請求。
async fn handle_create_foo(db: &Db, data: CreateFooRequest) -> Result<(), Error> { let db_item = DbItem::from(data); db.insert(db_item).await?; Ok(()) } |
因此,對於每個CreateFooRequest,我們將在我們的資料庫中插入一個專案。我們可以使用BatchMutex對它們進行批處理。
use benjamin_batchly::{BatchMutex, BatchResult}; async fn handle_create_foo( batch_mutex: &BatchMutex<(), DbItem>, db: &Db, data: CreateFooRequest, ) -> Result<(), Error> { let db_item = DbItem::from(data); match batch_mutex.submit((), db_item).await { BatchResult::Work(mut batch) => { db.bulk_insert(&batch.items).await?; batch.notify_all_done(); Ok(()) } BatchResult::Done(_) => Ok(()), BatchResult::Failed => Err(Error::BatchFailed), } } |
提交到BatchMutex提供 3 個非同步結果。
- Work :一批 1 個或多個專案,包括提交的專案,應處理。
- Done:提交的專案由另一個提交者批次處理並通知完成。
- Failed:提交的專案由另一個提交者批次處理,但在通知完成之前被丟棄。
因此,如果在批處理進行時有 100 個CreateFooRequest請求進入,它們將在submit處等待。上一批完成後,所有等待提交的內容將成為下一批。1 次呼叫將返回BatchResult::Work並且在batch.notify_all_done()呼叫後 99 次將返回BatchResult::Done。
注意:在示例中,我使用單位型別 () 作為submit的第一個引數。這是可用於分割槽批處理的“批處理金鑰”。只有使用相同批次金鑰提交的專案才會捆綁在一起,這在更一般的情況下很有用。
注意(2):也支援單獨的專案返回值,檢視文件以獲取更多資訊。
相關文章
- 簡單實現批處理
- [原始碼解析] PyTorch 分散式(16) --- 使用非同步執行實現批處理 RPC原始碼PyTorch分散式非同步RPC
- 如何使用Rust的gaffer實現優先順序的微批處理排程器 - njkRust
- 使用無伺服器實現檔案處理的批處理 - DZone Cloud伺服器Cloud
- Spark SQL:實現日誌離線批處理SparkSQL
- Spring Boot整合Spring Cloud Task實現批處理操作Spring BootCloud
- 批處理最佳實踐 - Vlad Mihalcea
- 批處理概述
- Spring中實現面向寫入的批次和批處理APISpringAPI
- Java後端開發中的任務排程:使用Spring Batch實現批處理Java後端SpringBAT
- Java 專案中使用 Resilience4j 框架實現非同步超時處理Java框架非同步
- python中非同步非阻塞如何實現Python非同步
- Go中使用訊息佇列實現微服務之間非同步資料處理Go佇列微服務非同步
- Spring Boot 之 Spring Batch 批處理實踐Spring BootBAT
- 使用Java預處理實現JSON插入PostgreSQLJavaJSONSQL
- 基於rust實現的事件系統,支援同步和非同步Rust事件非同步
- Windows下批處理分享:透過WinSCP實現SFTP傳輸資料WindowsFTP
- Windows 批處理之DATE命令的使用方法Windows
- Apache Beam,批處理和流式處理的融合!Apache
- 什麼是批處理
- Dynamics CRM 2013 批處理
- bat 批處理字串操作BAT字串
- window 批處理檔案
- 影片直播系統原始碼,非同步處理實現程式碼分析原始碼非同步
- Netty之非阻塞處理Netty
- 非同步流程處理非同步
- 非同步處理方法非同步
- JavaScript | 非同步處理JavaScript非同步
- 實戰Spring Boot 2.0系列(四) – 使用WebAsyncTask處理非同步任務Spring BootWeb非同步
- 實戰Spring Boot 2.0系列(四) - 使用WebAsyncTask處理非同步任務Spring BootWeb非同步
- rust學習十、異常處理(錯誤處理)Rust
- 在Windows中,使用批處理(.bat)檔案可以透過呼叫命令來實現自動撥號連線。以下是透過批處理檔案實現PPPoE(撥號)連線的基本步驟:WindowsBAT
- 學習Rust 錯誤處理Rust
- Asynq 實現 Go 後臺作業非同步定時任務處理Go非同步
- 架構設計 | 非同步處理流程,多種實現模式詳解架構非同步模式
- Python批處理:檔案操作Python
- MPP架構和批處理架構
- bat批處理常用指令碼BAT指令碼