MCPcopy
hub / github.com/panjf2000/ants

github.com/panjf2000/ants @v2.12.1 sqlite

repository ↗ · DeepWiki ↗ · release v2.12.1 ↗
250 symbols 958 edges 22 files 107 documented · 43%
README

A goroutine pool for Go

English | 中文

📖 Introduction

Library ants implements a goroutine pool with fixed capacity, managing and recycling a massive number of goroutines, allowing developers to limit the number of goroutines in your concurrent programs.

🚀 Features:

  • Managing and recycling a massive number of goroutines automatically
  • Purging overdue goroutines periodically
  • Abundant APIs: submitting tasks, getting the number of running goroutines, tuning the capacity of the pool dynamically, releasing the pool, rebooting the pool, etc.
  • Handle panic gracefully to prevent programs from crash
  • Efficient in memory usage and it may even achieve higher performance than unlimited goroutines in Go
  • Nonblocking mechanism
  • Preallocated memory (ring buffer, optional)

💡 How ants works

Flow Diagram

ants-flowchart-en

Activity Diagrams

🧰 How to install

For ants v1

go get -u github.com/panjf2000/ants

For ants v2 (with GO111MODULE=on)

go get -u github.com/panjf2000/ants/v2

🛠 How to use

Check out the examples for basic usage.

Functional options for pool

ants.Optionscontains all optional configurations of the ants pool, which allows you to customize the goroutine pool by invoking option functions to set up each configuration in NewPool/NewPoolWithFunc/NewPoolWithFuncGeneric method.

Check out ants.Options and ants.Option for more details.

Customize pool capacity

ants supports customizing the capacity of the pool. You can call the NewPool method to instantiate a Pool with a given capacity, as follows:

p, _ := ants.NewPool(10000)

Submit tasks

Tasks can be submitted by calling ants.Submit

ants.Submit(func(){})

Tune pool capacity at runtime

You can tune the capacity of ants pool at runtime with ants.Tune:

pool.Tune(1000) // Tune its capacity to 1000
pool.Tune(100000) // Tune its capacity to 100000

Don't worry about the contention problems in this case, the method here is thread-safe (or should be called goroutine-safe).

Pre-malloc goroutine queue in pool

ants allows you to pre-allocate the memory of the goroutine queue in the pool, which may get a performance enhancement under some special certain circumstances such as the scenario that requires a pool with ultra-large capacity, meanwhile, each task in goroutine lasts for a long time, in this case, pre-mallocing will reduce a lot of memory allocation in goroutine queue.

// ants will pre-malloc the whole capacity of pool when calling ants.NewPool.
p, _ := ants.NewPool(100000, ants.WithPreAlloc(true))

Release pool

pool.Release()

or

pool.ReleaseTimeout(time.Second * 3)

Reboot pool

// A pool that has been released can be still used after calling the Reboot().
pool.Reboot()

⚙️ About sequence

All tasks submitted to ants pool will not be guaranteed to be addressed in order, because those tasks scatter among a series of concurrent workers, thus those tasks would be executed concurrently.

👏 Contributors

Please read our Contributing Guidelines before opening a PR and thank you to all the developers who already made contributions to ants!

📄 License

The source code in ants is available under the MIT License.

📚 Relevant Articles

🖥 Use cases

business corporations & open-source organizations

Trusted by the following corporations/organizations.

If you're also using ants in production, please help us enrich this list by opening a pull request.

open-source software

The open-source projects below do concurrent programming with the help of ants.

  • gnet: A high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go.
  • milvus: An open-source vector database for scalable similarity search and AI applications.
  • nps: A lightweight, high-performance, powerful intranet penetration proxy server, with a powerful web management terminal.
  • TDengine: TDengine is an open source, high-performance, cloud native time-series database optimized for Internet of Things (IoT), Connected Cars, and Industrial IoT.
  • siyuan: SiYuan is a local-first personal knowledge management system that supports complete offline use, as well as end-to-end encrypted synchronization.
  • BillionMail: A future open-source Mail server, Email marketing platform designed to help businesses and individuals manage their email campaigns with ease.
  • WeKnora: An LLM-powered framework designed for deep document understanding and semantic retrieval, especially for handling complex, heterogeneous documents.
  • coze-loop: A developer-oriented, platform-level solution focused on the development and operation of AI agents.
  • osmedeus: A Workflow Engine for Offensive Security.
  • jitsu: An open-source Segment alternative. Fully-scriptable data ingestion engine for modern data teams. Set-up a real-time data pipeline in minutes, not days.
  • triangula: Generate high-quality triangulated and polygonal art from images.
  • teler: Real-time HTTP Intrusion Detection.
  • bsc: A Binance Smart Chain client based on the go-ethereum fork.
  • jaeles: The Swiss Army knife for automated Web Application Testing.
  • devlake: The open-source dev dat

Extension points exported contracts — how you extend this code

Option (FuncType)
Option represents the optional function.
options.go
Logger (Interface)
Logger is used for logging formatted messages.
ants.go

Core symbols most depended-on inside this repo

Running
called by 83
ants.go
Invoke
called by 79
pool_func.go
Release
called by 67
ants.go
Submit
called by 51
pool.go
insert
called by 26
worker_queue.go
Cap
called by 23
ants.go
Tune
called by 22
ants.go
binarySearch
called by 18
worker_stack.go

Shape

Function 118
Method 110
Struct 13
Interface 4
TypeAlias 4
FuncType 1

Languages

Go100%

Modules by API surface

ants_test.go53 symbols
ants.go31 symbols
multipool.go20 symbols
ants_benchmark_test.go17 symbols
worker_queue.go16 symbols
multipool_func_generic.go16 symbols
multipool_func.go16 symbols
options.go11 symbols
worker_stack.go9 symbols
worker_loop_queue.go9 symbols
example_test.go8 symbols
pkg/sync/spinlock_test.go7 symbols

Dependencies from manifests, versioned

github.com/davecgh/go-spewv1.1.1 · 1×
github.com/pmezard/go-difflibv1.0.0 · 1×
golang.org/x/syncv0.11.0 · 1×
gopkg.in/yaml.v3v3.0.1 · 1×

For agents

$ claude mcp add ants \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact