# Created on savesnippets.com ยท https://savesnippets.com/vEtRMaMzBXAD00 from concurrent.futures import ThreadPoolExecutor, as_completed import requests def fetch(url: str) -> tuple[str, int]: return url, requests.head(url, timeout=10).status_code urls = [f"https://httpbin.org/status/{n}" for n in (200, 404, 500, 200)] with ThreadPoolExecutor(max_workers=8) as pool: # Submit + collect as they finish (order != submit order) futures = {pool.submit(fetch, u): u for u in urls} for f in as_completed(futures): url, status = f.result() print(f"{status} {url}") # Simpler when you want input order preserved: with ThreadPoolExecutor(max_workers=8) as pool: for url, status in pool.map(fetch, urls): print(f"{status} {url}")