# @filamentgroup/worker-farm 中文文档

规范地址：https://npmcn.com/package/%40filamentgroup/worker-farm/

版本：1\.3\.2
npm 元数据更新时间：2022-06-12T17:54:53.987Z
中文译文更新时间：2026-11-14T18:05:10.344Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40filamentgroup/worker-farm
原文对照：https://npmcn.com/package/%40filamentgroup/worker-farm/?lang=original
项目主页：https://github.com/rvagg/node-worker-farm
源码仓库：https://github.com/rvagg/node-worker-farm

## 关键信息（来自 npm 元数据）

- 模块格式：CommonJS
- TypeScript 类型：未声明
- 运行依赖：2 个
- 首次发布：2015-06-10T19:54:58.109Z
- 最新版本发布：2016-07-26T03:44:41.913Z
- 近 30 天下载量：2579（2026-10-15 至 2026-11-13，npm 官方下载统计）
- 已发布版本数：2（近 12 个月 0 个）

## 中文简介

以 über- simple API 和自定义耐用和自定义货币选项向子进程分配处理任务 .

## 安装

```sh
npm install @filamentgroup/worker-farm
```

也可以使用：`pnpm add @filamentgroup/worker-farm`、`yarn add @filamentgroup/worker-farm`、`bun add @filamentgroup/worker-farm`

## README

# 农场 [![Build Status](https://secure.travis-ci.org/rvagg/node-worker-farm.png)](http://travis-ci.org/rvagg/node-worker-farm)

[![NPM](https://nodei.co/npm/worker-farm.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/worker-farm/) [![NPM](https://nodei.co/npm-dl/worker-farm.png?months=6&height=3)](https://nodei.co/npm/worker-farm/)

以 über- simple API 和自定义耐用和自定义货币选项向子进程分配处理任务 . _以npm计 **工农**_。 。 。 .

## 示例

鉴于一个文件, _孩子们.js_数字 :

```js
module.exports = function (inp, callback) {
  callback(null, inp + ' BAR (' + process.pid + ')')
}
```

还有一个主文件 :

```js
var workerFarm = require('worker-farm')
  , workers    = workerFarm(require.resolve('./child'))
  , ret        = 0

for (var i = 0; i < 10; i++) {
  workers('#' + i + ' FOO', function (err, outp) {
    console.log(outp)
    if (++ret == 10)
      workerFarm.end(workers)
  })
}
```

我们会得到一个输出 类似如下:

```
#1 FOO BAR (8546)
#0 FOO BAR (8545)
#8 FOO BAR (8545)
#9 FOO BAR (8546)
#2 FOO BAR (8548)
#4 FOO BAR (8551)
#3 FOO BAR (8549)
#6 FOO BAR (8555)
#5 FOO BAR (8553)
#7 FOO BAR (8557)
```

这个例子载于 _[实例/基础](https://github.com/rvagg/node-worker-farm/tree/master/examples/basic/)_ 目录.

### 例1:估计使用童工的情况

您也会在 _[实例/pi](https://github.com/rvagg/node-worker-farm/tree/master/examples/pi/)_ 估计 **页:1** 通过使用蒙特卡洛 _曲线下的区域_ 使用童工来完成单独的部分.

运行 `node examples/pi` 将给你一些像:

```
Doing it the slow (single-process) way...
π ≈ 3.1416269360000006  (0.0000342824102075312 away from actual!)
took 8341 milliseconds
Doing it the fast (multi-process) way...
π ≈ 3.1416233600000036  (0.00003070641021052367 away from actual!)
took 1985 milliseconds
```

## 重复性

工人农场的一个重要特点是 **调用耐用性**如果儿童程序在执行电话时因任何理由而死亡,这些电话将重新排队,并由其他儿童程序处理。 这样,当你要求做一些事情, 除非有事情 _说真的_ 做错什么,你应该得到一个结果 你的回调功能.

## 我用过的箱子

还有其他图书馆可用于管理工人流程,但我的使用情况相当具体:我需要大量使用 [节点-java](https://github.com/nearinfinity/node-java) 库与 JVM 代码交互。 不幸的是,由于JVM垃圾收集器如此难以与它互动,它容易在GC重载下踢出后杀死你的节点过程. 为了安全起见,我需要一个持久的方式打电话,以便(1) 它不会杀死我的主要过程和(2) 没有成功的电话会被重新提交处理.

工人农场允许我旋转多个JVM, 由节点控制, 并且有一个单一的,不复杂的API, 其行为与进程内API相同.

**不过**,不要认为"工人农场"是特指这个使用案例,它的设计非常通俗而简单,可以适应任何需要使用儿童节点过程的事物.

## API 密码

农场出口主要职能和 `end()` 方法。 主要功能设置了由协调的儿童加工工人组成的"农场",可用于即兴经营多家农场,所有农场都独立经营.

### 工人标签( \[选项,\] path ToModule \[,导出的方法\])

以最基本的形式,你叫 `workerFarm()` ,并使用儿童进程引用的模块文件路径。 你应该用一个 **绝对路径** 到模块文件,获取路径的最佳方式是 `require.resolve('./path/to/module')`,该函数可以完全与 `require('./path/to/module')` 但它返回绝对路径.

#### `exportedMethods`

如果您的模块导出单个函数 `module.exports` 那你应该省略最后参数。 但是,如果您正在将多个函数导出到 `module.exports` 然后,你应该把它们列在弦乐阵列中:

```js
var workers = workerFarm(require.resolve('./mod'), [ 'doSomething', 'doSomethingElse' ])
workers.doSomething(function () {})
workers.doSomethingElse(function () {})
```

列出可用的方法将指示工人农场在返回的对象上提供什么API。 如果你不列出一个 `exportedMethods` 组合,然后你会得到一个单一的可调用函数来使用;但是如果你列出可用的方法,那么你会得到一个具有可调用函数的物体,用这些名字来使用.

**假设您在孩子模块中调用的每个功能将使用 `callback` 函数作为最后一个参数.**

#### `options`

如果你不提供 `options` 对象然后使用下列默认值:

```js
{
    maxCallsPerWorker           : Infinity
  , maxConcurrentWorkers        : require('os').cpus().length
  , maxConcurrentCallsPerWorker : 10
  , maxConcurrentCalls          : Infinity
  , maxCallTime                 : Infinity
  , maxRetries                  : Infinity
  , autoStart                   : false
}
```

-   **`maxCallsPerWorker`** 允许您控制孩子的寿命。 肯定的数字将显示您只希望每个孩子在终止之前接受许多电话。 如果您需要控制孩子过程中的内存泄漏或类似情况,这可能是有益的.
    
-   **`maxConcurrentWorkers`** 将设定要同时维护的儿童流程数量。 默认情况下,它设定为当前系统中可用的CPU数量,但它可以是任何合理的数量,包括 `1`。 。 。 .
    
-   **`maxConcurrentCallsPerWorker`** 允许您控制 _货币_ 儿童个人过程。 电话被排入排队,并按允许他们同时接听的电话数量,被养成儿童程序。 默认情况下,它被任意设定为10个,这样,电话在工人之间相对平均地共享,但是,如果你的电话预计需要类似的时间,那么你可以设定为: `Infinity` 工人农场不会排队接听任何电话,而是将电话平均分布在孩子身上,让他们去接听。 如果你的电话不是I/O绑定的,那么你在这里使用的价值就不重要了,因为个别工人一次不能执行一个以上的电话.
    
-   **`maxConcurrentCalls`** 允许您控制队列中的最大拨打次数—— 或正在积极处理, 或等待工人处理 . `Infinity` 表示没有限制,但如果您具备可能无休止地排队工作的条件,并且您需要设定限制,请提供 `>0` 值和任何推动限制的呼叫都会以 `MaxConcurrentCallsError` 错误( 请检查 `err.type == 'MaxConcurrentCallsError'`) (中文(简体) ).
    
-   **`maxCallTime`** _在你使用它之前,先了解它的作用_ 何时 `!== Infinity`时,以毫秒计 _任何一次通话_ 可以在工人身上行刑。 如果只用一个电话就超过这个时限,那么负责打这个电话的工人就会被杀死,任何打着这个工人的电话都会带着一个电话返回 `TimeoutError` (检查) `err.type == 'TimeoutError'`) (中文(简体) ). 如果你正在运行 `maxConcurrentCallsPerWorker` 值大于 `1` 接下来 **所有正在执行的呼叫** 将失败,并将自动重新提交 unless you've changed the `maxRetries` 选项。 使用这个,如果您有工作, 可能会在无限循环中结束, 您无法编程结束您的孩子代码 。 最好用一个 `maxConcurrentCallsPerWorker` 所以你不中断其他电话 当你有超时。 这种暂停是按电话进行,但会打断整个工人.
    
-   **`maxRetries`** 允许您在员工终止(意外或超时)后控制最多次数的调用。 默认情况下,此选项将设定为 `Infinity` 也就是说每个被解职的工人的每次通话都会被自动重排. 当重复次数超过时 `maxRetries` 值,将使用 `ProcessTerminatedError`。请注意,如果运行时有限度 `maxCallTime` 财务报告和审定财务报表 `maxConcurrentCallsPerWorkers` 大于 `1` 然后是任意 `TimeoutError` 将会增加复读计数器 _每个_ 被解聘的工人同时打电话.
    
-   **`autoStart`** 设定为 `true` 将尽早发动工人。 当工人要做昂贵的初始化时使用这个. 这样一来,他们就会准备好 当第一个请求通过.
    

### farm.end(农场)

儿童过程会无限期地活着等待工作,你的农场经理会活着管理它的工人,所以如果你需要它来阻止的话,你就必须明确地这样做。 如果你把农场API送到 `workerFarm.end()` 然后它会干净结束你的工人过程。 注意,虽然这是一个 _软_ 结束所以它会等待孩子的过程 完成他们的工作 然后再要求他们死.

任何被排队和尚未由儿童程序处理的电话都将被放弃. `end()` 仅等待目前进行中的项目.

一旦你结束一个农场, 它不会处理 任何更多的电话,所以不要尝试!

## 许可证

(c) 2014年罗德瓦格 [@rvagg( 维基百科)](https://twitter.com/rvagg) 并持有麻省理工学院许可证。 麻省理工学院许可证中未明确授予的所有权利均予保留。 详见包含的LICENSE.md文件.

## 常见问题

### @filamentgroup/worker-farm 是什么？

以 über- simple API 和自定义耐用和自定义货币选项向子进程分配处理任务 \.

### 如何安装 @filamentgroup/worker-farm？

在项目目录运行 npm install @filamentgroup/worker-farm，或使用 pnpm add / yarn add / bun add。

### @filamentgroup/worker-farm 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/filamentgroup\_\_worker-farm 是否存在。

### @filamentgroup/worker-farm 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @filamentgroup/worker-farm 可以商用吗？

@filamentgroup/worker-farm 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @filamentgroup/worker-farm 的下载量有多少？

根据 npm 官方下载统计，@filamentgroup/worker-farm 在 2026/10/15 – 2026/11/13 这 30 天内被下载 2,579 次，日均约 86 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @filamentgroup/worker-farm 还在维护吗？

最新版本 1\.3\.2 发布于 2016/07/26（10 年前）；至今共发布 2 个版本，其中过去 12 个月发布了 0 个；首次发布于 2015/06/11。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

