Rotating vs sticky sessions
Three Exit mode options decide whether a residential proxy keeps one IP or changes it; new proxies start on sticky.
Size your thread count from your target request rate, then raise it in steps while watching errors.
A concurrent-connection (thread) limit is the number of connections a proxy plan lets you hold open at the same time. If a plan allows 50 and you try to open 80, the extra connections are refused or queued, depending on the provider. The limit is about simultaneous connections, not about how many GB or requests you use in total.
Providers state the limit on their plan pages in their own words (threads, sessions, simultaneous connections), so compare the wording and not just the number.
| Item | Requests per minute | Average time per request | Connections in flight |
|---|---|---|---|
| Light check | 60 | 1 s | 60 ÷ 60 × 1 = 1 |
| Steady scraping | 600 | 2 s | 600 ÷ 60 × 2 = 20 |
| Slow target | 600 | 5 s | 600 ÷ 60 × 5 = 50 |
| High rate | 3,000 | 2 s | 3,000 ÷ 60 × 2 = 100 |
Connections in flight = requests per second × average seconds per request. Example numbers for the arithmetic; measure your own response time through the proxy. Add some headroom for retries.
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from urllib.parse import quote
import requests
user = quote("USERNAME", safe="")
password = quote("PASSWORD", safe="")
proxy = f"http://{user}:{password}@proxy.proxy302.com:2222"
proxies = {"http": proxy, "https": proxy}
WORKERS = 20 # start from your calculation, not from the maximum
def fetch(url):
started = time.monotonic()
r = requests.get(url, proxies=proxies, timeout=(5, 20))
return r.status_code, time.monotonic() - started
urls = ["https://example.com/"] * 200 # replace with your own URLs
with ThreadPoolExecutor(max_workers=WORKERS) as pool:
futures = [pool.submit(fetch, u) for u in urls]
for f in as_completed(futures):
try:
status, seconds = f.result()
except requests.RequestException as exc:
print("error", type(exc).__name__)
else:
print(status, round(seconds, 2))Example only. Replace USERNAME and PASSWORD with the values from My assets. ThreadPoolExecutor(max_workers=N) runs at most N calls at once. Each requests.get opens its own connection, so with a rotating setup a new connection can mean a new IP.
The idea is the same in Node.js: fix the number of requests in flight, and start the next one only when one finishes. The proxy setup for Node.js, including HTTP and SOCKS5, is in the Node.js proxy guide.
Whatever the language, keep a hard upper bound on in-flight requests in code instead of firing everything at once.
Start at the number from the table, not at the maximum. Send a few hundred requests and record status codes and times.
Double the thread count and repeat. Stop raising it when timeouts, HTTP 429 or 403 responses start to grow: the target is telling you its limit.
Back off on 429 and 5xx responses, honour a Retry-After header if the site sends one, and stay within the site's terms and rate limits. More threads do not make a site allow more requests.
The Proxy302 residential lines do not cap concurrent connections, and in a test on 11 November 2026 100 connections open at the same time all worked. This is a statement about the cap, not about speed.
Two practical points. More concurrency spends your GB faster, because traffic is billed per GB whatever the thread count. And without a session, each new connection gets a new IP, so a thread pool that opens many connections will use many IPs; a reused (keep-alive) connection keeps its IP.
Requests per second times the average seconds per request. For 10 requests a second at 2 seconds each that is about 20.
No cap is set on the residential lines. We tested 100 connections open at once and all worked. That is not a speed promise.
The target site is limiting your request rate. Lower the thread count, add a delay or backoff, and check the site's rules.
It does not change the price per GB, but it uses your GB faster because more requests are sent in the same time.
Product observation · Confirmed on:
Product facts file of the site, checked 10 November 2026 against the console, the backend and the price table: rotating residential Budget and Premium per-GB prices and packages (1 PTC = US$1), no expiry of purchased traffic, protocols and ports, no free trial.
Official documentation · Confirmed on:
Read on 12 November 2026: ThreadPoolExecutor runs calls on a pool of at most max_workers threads; the default is min(32, os.cpu_count() + 4) since Python 3.8; as_completed yields futures as they finish; thread pools are meant to overlap I/O.
Product observation · Confirmed on:
Test of 11 November 2026 on rotating residential: 100 connections open at the same time, all of them worked. No concurrent-connection cap is set on the residential lines. This says nothing about speed.
Create an account, top up once, then pick rotating residential, static ISP or datacenter IPs and have one running in your browser within minutes.