Skip to content
Theme

JOB 02Reference

Comparison

This table compares varmq with ants, pond v2, conc, workerpool, errgroup and gopool. The cells are the same as in the feature comparison in the README. The amber notes are new here: they say where a varmq Yes has a limit.

How to read it. Every row is a feature varmq has, so the varmq column reads Yes all the way down. The table does not list features that another library has and varmq lacks. Where a varmq Yes has a limit, the row says so in amber, with the page of these docs that explains it. For speed, see the benchmarks.
Features of varmq, ants, pond, conc, workerpool, errgroup and gopool. Each cell says Yes or No.
Featurevarmqantspondconcworkerpoolerrgroupgopool
Generic (type-safe) APIYesYesYesYesNoNoNo
Tasks return results and errorsvarmq limit Only on in-memory queues. On a persistent or distributed queue, Add returns a bool and no job handle, so there is nothing to Wait on and no Err or Result to read. Worker typesYesNoYesYesNoNo2No
Task groups (submit many, wait once)varmq limit Only on in-memory queues. A persistent or distributed queue has no AddAll. Persistence overviewYesNoYesYesNoYesNo
Priority queueYesNoNoNoNoNoNo
Persistent queues (survive restarts)varmq limit varmq has no adapter of its own: you add redisq (Redis) or sqliteq (SQLite). The best case is at-least-once delivery, so a job can run twice. What this guaranteesYesNoNoNoNoNoNo
Distributed queues (across instances)varmq limit Of the existing adapters, only redisq (Redis) provides one. sqliteq has no distributed queue. An adapter of your own can implement IDistributedQueue. SQLiteYesNoNoNoNoNoNo
Several queues bound to one poolYesNoYes4NoNoNoNo
Topic fan-out (publish once, many pools)varmq limit Topics are in-memory only. A persistent topic was built and removed before release, so it is not part of v1.10.0. Persistent topicsYesNoNoNoNoNoNo
Bounded queue, reject when fullvarmq limit Not with redisq or sqliteq. Neither implements CapacitySetter, so Add is not refused on their persistent or distributed queues. An adapter of your own can implement it. Persistence overviewYesYesYesNoNoNo3No
Pause and resumevarmq limit On a persistent or distributed queue, Pause and Stop do not park a job the worker already took. It runs. AcknowledgementYesNoNoNoYesNoNo
Restart after stopYesYesNoNoNoNoNo
Resize pool at runtimeYesYesYesNoNoNoYes
Cancel work via contextvarmq limit Cancelling the context shuts the worker down. A running job is not interrupted: varmq cannot stop a function. Jobs that wait do not start. ContextYesNoYesYesNoYesNo
Panic recoveryYesYesYesNo1NoNoYes
Task counters (submitted, failed, ...)YesNoYesNoNoNoNo
Built-in REST APIYesNoNoNoNoNoNo
  1. conc re-raises a task’s panic from Wait by design.
  2. errgroup returns the first error, no results.
  3. errgroup has no queue; TryGo only refuses a task while every slot is busy.
  4. pond subpools: each has its own queue and runs on the parent pool’s workers.

Checked against each package’s source, October 2026.

For how fast each one runs, see the benchmarks, with the raw data in goptics/benchmarks, and the bench log.

VarMQ is MIT licensed. Benchmark figures come from github.com/goptics/benchmarks.