OP-Proxy
PricingBlogResellerAPI
Dashboard
← Blog
Deep dive·August 11, 2026·3 min read

How many threads a scraper needs: the practical maths

The most common question in support is which plan to take. The answer is arithmetic, and it works from the deadline you need to hit — not from the size of the catalogue.

In this article

  • What a thread is
  • The formula
  • Why you add headroom
  • When you really do need many threads
  • How to tell you have hit the ceiling
  • Why your scraper's thread count is not your connection count
  • Scrapy counts this differently

What a thread is

A thread is one simultaneously open connection to the proxy. A 50-thread plan means no more than fifty connections are active at any moment. How many requests pass through them in a day is unlimited: fifty threads can deliver a thousand requests or a million.

Which leads to the key point: a thread is not speed. Doubling threads speeds collection up only when threads are the bottleneck — not the target site's response time.

The formula

The thread count you need follows from three numbers: how many requests to make, over what period, and how long one response takes on average.

text
threads = requests × response_time / deadline

Example: 10,000 cards, 0.7 s response, one hour to finish.
10,000 × 0.7 / 3600 ≈ 2 threads on average.

That looks surprisingly small, and it should: across an hour the load is spread thin. But the average is not what you should size against.

Why you add headroom

The average ignores three things that consume capacity in practice.

  • Retries: some requests fail and go round again, taking extra connections.
  • Response-time spread: slow pages hold a thread many times longer than the average.
  • Burstiness: collection rarely flows evenly, with peaks at the start and end.

A practical multiplier is five to ten times the calculated average. For the example above that is 10–20 threads, and the 50-thread Starter-1 plan covers it with plenty to spare.

When you really do need many threads

The number grows from compressing the deadline, not from the catalogue. The same 10,000 cards in five minutes rather than an hour means about 25 threads on average and 150–250 with headroom. A twelvefold speed-up needs twelvefold the connections.

text
10,000 cards, 0.7 s response:
  in 1 hour  → ~2 average   → 50-thread plan
  in 10 min  → ~12 average  → 100–200 threads
  in 5 min   → ~25 average  → 300–500 threads

How to tell you have hit the ceiling

If raising the thread count in your software does not speed collection up, the bottleneck is not the plan. Check the target's response time and your retry rate — usually those, not the connection limit, set the pace.

The opposite sign is connections consistently waiting in queue while bandwidth use stays low. That is an exhausted thread limit, and the plan is worth raising.

Why your scraper's thread count is not your connection count

This is the main source of divergence between your settings and what the proxy sees. A connection with keep-alive enabled serves many requests in sequence, so ten worker threads may hold fewer than ten sockets. But the reverse also happens, and the second case is the unpleasant one.

python
import requests
from requests.adapters import HTTPAdapter

session = requests.Session()
session.mount("https://", HTTPAdapter(
    pool_maxsize=50,     # no lower than your worker count
    pool_block=True,     # extra threads wait instead of opening sockets past the pool
))

# What happens with pool_block=False (the default):
# connections beyond pool_maxsize are created on demand, but they are NOT
# retained after use. So 50 threads against a pool of 10 cause constant
# rebuilding — and the proxy sees not 10 sessions
# but a stream of new connections.

The point is that the connection pool and the thread count are independent settings, and when the pool is smaller, each extra connection is created fresh per request and closed afterwards. To the proxy that looks like many short sessions instead of a few long ones, and the limit drains faster than you planned.

  • Pool smaller than thread count — constant connection rebuilding and wasted limit.
  • HTTP/2 multiplexes many requests onto one socket: fewer connections than requests.
  • Redirects and TLS handshakes add connections that your arithmetic does not include.
  • A retry after a reset opens a new socket rather than reusing the old one.

Scrapy counts this differently

Check the settings before doing the arithmetic here. The overall ceiling is one value, but a per-domain limit also applies, and from some versions the new-project template writes fairly cautious defaults — one request per domain and a one-second delay.

Separately: Scrapy's per-IP concurrency setting is deprecated. If your load calculation leaned on it, move the calculation to the per-domain and global limits — otherwise behaviour changes silently after an upgrade.

A plan that matches your maths

The scale starts at 50 threads for 650 ₽ and runs to several thousand. Moving up a plan is done in the dashboard without rebuilding your configuration.

View pricing

Proxies for this job

  • For multi-threaded software

Check it with our tools

  • Speed test

Read next

  • How sites detect proxies: three measurement layers, and which one a proxy changesA target measures three independent layers: the address, the TLS handshake and HTTP behaviour. Through a tunnel, TLS and HTTP keep describing your client while the address and TCP describe the proxy machine. That split is itself a signal.
  • How to check a proxy: a seven-step order instead of guessworkCheck in order: reachability, authentication, exit address, geo, DNS, leaks, throughput. One command per step and the exact error code you get when that particular step is what broke.
  • How many threads to set in a scraper for your proxy plan: A-Parser, Key Collector, ZennoPoster, NetpeakThreads add up across every running task, proxy checkers included. Where the ceiling is set by the program, where by the licence, and where the cheapest plan is already oversized.
OP-Proxy
Plans & Information
PricingBlogReseller programAPITerms of ServicePrivacy Policy
Proxies by use case
For parsing and scrapingFor multi-threaded softwareFor marketplacesFor antidetect browsersFor captcha softwareFor SEO and SERP checksRotating IPv6 and IPv4IPv6 proxiesStatic datacenter IPv4
Tools
My IP AddressSpeed TestAnonymity CheckWHOIS LookupDNS Leak TestWebsite Check
ИП Артамонов Анатолий Михайлович ОГРНИП 324700000026212 ИНН 701755408691