chunk-process v0.1.0 をリリースしました
この記事の操作
@hideokamoto/sequential-promise を chunk-process にリネームして、v0.1.0としてリリースしました。このライブラリは、チャンク単位で並列処理しながらレート制限やリソース管理を行うためのものです。名前が長すぎて用途が分かりにくかったので、もっとシンプルで覚えやすい chunk-process に変更しました。
インストール方法
npm install chunk-process
@hideokamoto/sequential-promise からの移行方法
移行は簡単です。パッケージを入れ替えて、import文を書き換えるだけです。まず、旧パッケージをアンインストールして新パッケージをインストールします。
npm uninstall @hideokamoto/sequential-promise
npm install chunk-process
次に、import文を新しいパッケージ名に変更します。
// 変更前
import batchProcess from '@hideokamoto/sequential-promise'
import { batchProcess, arrayBatch } from '@hideokamoto/sequential-promise'
// 変更後
import batchProcess from 'chunk-process'
import { batchProcess, arrayBatch } from 'chunk-process'
関数の互換性について
batchProcess や arrayBatch を利用している場合、関数のシグネチャも動作も変わっていません。
もし arrayChunk を使っている場合は、arrayBatch に置き換えてください。内部的な動作に変更はありません。
// ❌ 非推奨
import { arrayChunk } from '@hideokamoto/sequential-promise'
const batches = arrayChunk(items, 3)
// ✅ 推奨
import { arrayBatch } from 'chunk-process'
const batches = arrayBatch(items, 3)
chunk-processの機能
このライブラリの特徴を簡単に紹介します。
バッチ処理
指定した数のアイテムを並列で処理し、終わったら次のバッチに進みます。例えば、100件のAPIリクエストを5件ずつ処理する場合は。次のように実装します。
import batchProcess from 'chunk-process'
const userIds = Array.from({ length: 100 }, (_, i) => i + 1)
const results = await batchProcess(userIds, async (userId) => {
return await fetchUserFromAPI(userId)
}, { batchSize: 5 })
この実装では、5件ごとにまとめて処理が走ります。ある程度のバッチサイズでまとめて実行したい場合に利用しますしょう。なお、delayBetweenBatchesオプションを追加することで、バッチ間に遅延を入れることができます。これを利用して外部 APIを利用する際のレートリミット制限に対処しましょう。
await batchProcess(apiRequests, async (request) => {
return await fetch(request.url)
}, {
batchSize: 5,
delayBetweenBatches: 1000 // バッチ間に1秒待つ
})
リトライ機能
失敗したタスクを自動でリトライする機能も用意しました。指数バックオフと線形バックオフが選べます。
const results = await batchProcess(items, async (item) => {
return await processItem(item)
}, {
retry: {
maxAttempts: 3,
backoff: 'exponential', // または 'linear'
initialDelay: 100
}
})
エラーハンドリング
エラーが起きても処理を続けられます。エラーは結果として返されるので、後でチェックできます。
const results = await batchProcess(items, async (item) => {
return await processItem(item)
}, {
continueOnError: true
})
// エラーをチェック
results.flat().forEach((result, index) => {
if (result instanceof Error) {
console.error(`Item ${index} failed:`, result.message)
}
})
進捗追跡
処理の進捗をリアルタイムで監視できます。
await batchProcess(items, async (item) => {
return await processItem(item)
}, {
batchSize: 10,
onProgress: (completed, total) => {
const percentage = (completed / total * 100).toFixed(1)
console.log(`進捗: ${completed}/${total} バッチ (${percentage}%)`)
}
})
タイムアウト制御
各タスクに最大実行時間を設定できます。ハングアップを防げます。
await batchProcess(tasks, async (task) => {
return await performTask(task)
}, {
timeout: 5000 // 5秒でタイムアウト
})
実際の使い方
外部APIを大量に呼び出すときの例です。レート制限を守りながら、1000件のユーザー情報を取得します。
import batchProcess from 'chunk-process'
const userIds = [1, 2, 3, /* ... */, 1000]
const users = await batchProcess(userIds, async (userId) => {
const response = await fetch(`https://api.example.com/users/${userId}`)
return await response.json()
}, {
batchSize: 5, // 5件ずつ並列処理
delayBetweenBatches: 1000, // バッチ間に1秒待つ
retry: {
maxAttempts: 3,
backoff: 'exponential'
},
onProgress: (completed, total) => {
console.log(`処理中: ${completed}/${total} バッチ`)
}
})
メモリやCPUを気にしながら大量のデータを処理する例です。
import batchProcess from 'chunk-process'
const largeDataset = [/* 大量のデータ */]
const processed = await batchProcess(largeDataset, async (data) => {
return await heavyProcessing(data)
}, {
batchSize: 10, // 10件ずつ処理してメモリ使用量を抑える
timeout: 30000, // 30秒でタイムアウト
continueOnError: true
})
ドキュメント
- API ドキュメント: https://hideokamoto.github.io/chunk-process/
- GitHub: https://github.com/hideokamoto/chunk-process
- npm: https://www.npmjs.com/package/chunk-process
旧パッケージについて
@hideokamoto/sequential-promise は npm で deprecated になっています。インストールしようとすると、chunk-process への移行を促すメッセージが表示されます。今後は chunk-process で開発を続けます。
まとめ
- パッケージ名を
chunk-processに変更 - v0.1.0 として新しくリリース
- APIは完全に後方互換(コード変更不要)
- 名前が短くて覚えやすくなった
チャンクベースの並列処理でレート制限やリソース管理をしたいときは、ぜひ試してみてください。質問や問題があれば、GitHub Issues でお知らせください。
⭐ この記事への反応
はてなアカウントでスターを付けることができます
