chunk-process v0.1.0 をリリースしました

Article actions
View in Markdown

Requires Chrome (latest) built-in AI.

Requires Chrome (latest) built-in AI.

@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
})

ドキュメント

旧パッケージについて

@hideokamoto/sequential-promise は npm で deprecated になっています。インストールしようとすると、chunk-process への移行を促すメッセージが表示されます。今後は chunk-process で開発を続けます。

まとめ

  • パッケージ名を chunk-process に変更
  • v0.1.0 として新しくリリース
  • APIは完全に後方互換(コード変更不要)
  • 名前が短くて覚えやすくなった

チャンクベースの並列処理でレート制限やリソース管理をしたいときは、ぜひ試してみてください。質問や問題があれば、GitHub Issues でお知らせください。

Hidetaka Okamoto profile photo

Hidetaka Okamoto

Business Development

I'm a Business Development professional at DigitalCube. Based on my experience in EC ASP development and as a Developer Advocate at Stripe, I'm working on methods to increase revenue for SaaS and EC sites, exploring efficiency improvements using generative AI, and developing new business models. You can follow me on Twitter at @hidetaka__dev

Share:

Related Articles