```yaml
product: AlterLab
title: "Concurrency — Web Scraping Glossary | AlterLab"
comparison_context: "AlterLab is an alternative to Firecrawl, ScrapingBee, and Bright Data."
source_url: https://alterlab.io/glossary/concurrency
```

infrastructure

# Concurrency

Concurrency in scraping refers to the number of requests or browser sessions running in parallel, which directly controls throughput and resource consumption.

Concurrency determines how many scraping operations execute simultaneously. Higher concurrency means more data per unit time, but also more memory, CPU, and network bandwidth consumed, and a greater likelihood of triggering rate limits or anti-bot detections on the target site.

Scraping frameworks implement concurrency using threads (Python threading), async I/O (asyncio, Twisted), or process pools. Async I/O is especially efficient for I/O-bound scraping because thousands of in-flight HTTP requests can be managed with minimal thread overhead. Browser-based scraping is limited by the memory footprint of each browser instance (typically 100–300 MB per Chrome process).

Scraping platforms like AlterLab enforce per-account concurrency limits based on the billing tier. Requests above the concurrency cap are queued rather than rejected, ensuring predictable throughput without overloading the worker pool.

### What is Concurrency?

Concurrency in scraping refers to the number of requests or browser sessions running in parallel, which directly controls throughput and resource consumption.

### How does AlterLab handle Concurrency?

Scraping platforms like AlterLab enforce per-account concurrency limits based on the billing tier. Requests above the concurrency cap are queued rather than rejected, ensuring predictable throughput without overloading the worker pool.

## Examples

```
# asyncio: scrape 10 URLs concurrently
import asyncio, httpx

async def fetch(client, url):
    r = await client.get(url)
    return {"url": url, "status": r.status_code}

async def main(urls):
    async with httpx.AsyncClient() as client:
        return await asyncio.gather(*[fetch(client, u) for u in urls])

results = asyncio.run(main(urls[:10]))
```

## Related Terms

[Rate LimitingA server-side control that caps the number of requests accepted from a single IP or session within a time window, returning HTTP 429 when exceeded.](https://alterlab.io/glossary/rate-limiting)[Job QueueA job queue is a buffer that decouples producers (tasks submitted by clients) from consumers (workers that execute the tasks), enabling asynchronous, scalable processing.](https://alterlab.io/glossary/queue)[Proxy PoolA managed collection of proxy IP addresses used to distribute outbound requests across multiple origins and stay below per-IP rate limits.](https://alterlab.io/glossary/proxy-pool)[Scraping APIA managed web scraping service that abstracts proxy rotation, JavaScript rendering, and automatic website compatibility into a single HTTP endpoint.](https://alterlab.io/glossary/scraping-api)[Retry LogicAutomated re-sending of failed requests with backoff strategies, essential for handling transient errors, rate limits, and flaky anti-bot challenges.](https://alterlab.io/glossary/retry-logic)

## Extract Concurrency data from any website

AlterLab returns clean, structured data from any public URL — no scraper infrastructure needed. Start free, no credit card required.

[View API docs](https://alterlab.io/docs/api/rest)

[Back to Glossary](https://alterlab.io/glossary)