Skip to content

doc: WorkerPool async_hooks example warns about max listeners #35952

@loganfsmyth

Description

@loganfsmyth

📗 API Reference Docs Problem

  • Version: 15.0.1
  • Platform: All
  • Subsystem: async_hooks

Location

The example WorkerPool using async_hooks

Affected URL(s):

Description

The code I'm explicitly concerned about is

  runTask(task, callback) {
    if (this.freeWorkers.length === 0) {
      // No free threads, wait until a worker thread becomes free.
      this.once(kWorkerFreedEvent, () => this.runTask(task, callback));
      return;
    }

    // ...

Since this code snippet is presented explicitly as how to do something and is very much code that developers could easily end up copy-pasting into their own codebase, I figured it was worth raising as a potential issue.

This code has 2 issues:

  • This quickly triggers a MaxListenersExceededWarning since it adds a listener for every queued task and that number is unbounded
  • This is O(N^2) because when the kWorkerFreedEvent fires, it fires every callback (even though N-1 will just be re-queued), and once listeners have to do a linear search to remove themselves when they fire

Thoughts?

✍️


  • I would like to work on this issue and
    submit a pull request.

Metadata

Metadata

Assignees

No one assigned

    Labels

    docIssues and PRs related to the documentations.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions