Skip to main content

Overview

Swarms provides powerful utilities for scaling agent execution horizontally through concurrent and parallel processing. This guide covers the different scaling patterns, performance optimization techniques, and best practices for running agents at scale.

Scaling Patterns

Swarms offers multiple execution patterns for different scaling scenarios:

Concurrent Execution

Basic Concurrent Execution

Run multiple agents on the same task concurrently using ThreadPoolExecutor:

Concurrent with Dictionary Output

Get results as a dictionary mapping agent names to outputs:

Concurrent with Images

Asynchronous Execution

Basic Async Execution

High-Performance Async with uvloop

swarms does not ship a dedicated uvloop-specific execution function. For maximum async throughput on Linux/macOS, install uvloop yourself and install it as the event loop policy before calling the standard async helpers (run_agents_concurrently_async, run_agent_async):

Batch Processing

Batched Concurrent Execution

Process agents in batches to avoid resource exhaustion:

Grid Execution (Different Tasks)

Run different tasks across different agents:

Batch with Agent-Task Pairs

Performance Optimization

Worker Configuration

Dynamic Context Window

Optimize token usage with dynamic context windows:

Memory Management

Batch Size Tuning

Load Balancing

Round-Robin Distribution

Priority-Based Distribution

Monitoring at Scale

Real-Time Metrics

Throughput Monitoring

Best Practices

1. Choose the Right Pattern

  • I/O-bound tasks (API calls): Use run_agents_concurrently with high worker count
  • CPU-bound tasks: Use run_agents_concurrently with worker count = CPU cores
  • Async workloads: Use run_agents_concurrently_async (optionally with uvloop installed as the event loop policy)
  • Mixed tasks: Use batched_grid_agent_execution

2. Configure Workers Appropriately

3. Implement Graceful Degradation

4. Monitor Resource Usage

5. Use Appropriate Timeouts

Agent itself does not take a timeout constructor parameter. Enforce timeouts at the execution layer instead, by bounding a future’s result when running concurrently: