Queue-Based Task Distribution
Learn how message queues like Redis and Celery decouple URL discovery from fetching to scale scraping across many workers.
Queue-Based Task Distribution is a free Web Scraping & Bots lesson on CoddyKit — lesson 4 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the Web Scraping & Bots learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
The Scaling Bottleneck
A single-process scraper is limited by one machine's CPU and network. To scale, you split work across many workers running in parallel, possibly on different servers.
A task queue is the glue that distributes work safely.
Producers and Consumers
The queue pattern has two roles:
- Producers discover URLs and push tasks onto the queue.
- Consumers (workers) pull tasks and fetch the pages.
Decoupling them lets each side scale independently.
A Redis-Backed Queue
Redis lists make a simple, fast queue. Producers LPUSH URLs; workers BRPOP them, blocking until work is available.
import redis
r = redis.Redis()
# producer
r.lpush('urls', 'https://site.com/page1')
# worker
_, url = r.brpop('urls')
print('processing', url)Why Not Share a Python List
An in-memory list only works within one process. A Redis queue is shared across processes and machines, persists if a worker crashes, and handles concurrency atomically.
Introducing Celery
Celery is a full task framework built on a broker like Redis. You define tasks as functions and call them asynchronously; workers pick them up automatically.
from celery import Celery
app = Celery('scraper', broker='redis://localhost:6379/0')
@app.task
def scrape(url):
return fetch_and_parse(url)Dispatching Tasks
Calling .delay() enqueues the task and returns immediately. Workers running celery worker consume and execute them in parallel.
for url in discovered_urls:
scrape.delay(url)Retries and Failures
Celery can automatically retry failed tasks with backoff, so a transient network error does not lose a URL.
@app.task(bind=True, max_retries=3, default_retry_delay=10)
def scrape(self, url):
try:
return fetch_and_parse(url)
except ConnectionError as e:
raise self.retry(exc=e)Deduplicating URLs
In distributed crawling the same URL can be discovered twice. Use a Redis set as a 'seen' filter so each page is fetched once.
if r.sadd('seen', url):
scrape.delay(url) # sadd returns 1 only if newly addedBackpressure and Concurrency
Tune worker concurrency to match target-site politeness and your bandwidth. Too many workers overwhelm the site; too few leave the queue backed up. Monitor queue length to find balance.
# start 4 worker processes
// celery -A scraper worker --concurrency=4Results and Storage
Workers should write parsed data to a shared store (a database or object storage), not return it through the queue. The queue carries tasks; the datastore holds results.
Priority Queues
Not all URLs are equal. Route urgent tasks (a category index that unlocks many child pages) to a high-priority queue so workers handle them before low-value pages.
scrape.apply_async(args=[url], priority=9) # higher runs soonerQuick Check
Test your understanding of queue-based distribution.
Recap
You learned to scale scraping with task queues: the producer/consumer pattern, Redis-backed queues, Celery tasks with .delay(), automatic retries, URL deduplication with Redis sets, tuning concurrency, and writing results to shared storage.
Frequently asked questions
Is the “Queue-Based Task Distribution” lesson free?
Yes — the full text of “Queue-Based Task Distribution” is free to read here on the web, and the Web Scraping & Bots course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the Web Scraping & Bots course, upgrade to CoddyKit PRO.
What will I learn in “Queue-Based Task Distribution”?
Learn how message queues like Redis and Celery decouple URL discovery from fetching to scale scraping across many workers. You practise Web Scraping & Bots with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start Web Scraping & Bots?
No prior experience is required. Web Scraping & Bots on CoddyKit is structured for beginners through advanced learners; this is — lesson 4 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “Queue-Based Task Distribution” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this Web Scraping & Bots lesson?
Yes. Every Web Scraping & Bots lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- Distributed Scraping with Scrapy
- Cloud Functions for Scraping
- Monitoring and Logging
- Queue-Based Task Distribution