Introduction
Concurrent.futures provides high-level interface for asynchronous task execution.
ThreadPoolExecutor
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
def task(n):
time.sleep(1)
return n ** 2
with ThreadPoolExecutor(max_workers=4) as executor:
futures = [executor.submit(task, i) for i in range(10)]
for future in as_completed(futures):
print(f"Result: {future.result()}")
ProcessPoolExecutor
from concurrent.futures import ProcessPoolExecutor
def cpu_intensive(n):
return sum(i ** 2 for i in range(1000000))
with ProcessPoolExecutor(max_workers=4) as executor:
results = list(executor.map(cpu_intensive, range(10)))
Submit and Future
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(max_workers=4)
future = executor.submit(pow, 2, 3)
print(future.result()) # 8
executor.shutdown(wait=True)
Practice Problems
- Parallelize web scraping
- Process images concurrently
- Download multiple files
- Use ProcessPoolExecutor for CPU tasks
- Handle exceptions in futures