Skip to content
← All tracks

True Parallelism and the Runtime

Python

The GIL, free-threading, multiprocessing start methods, subinterpreters and what parallelism actually costs.

This track is written for Python, which isn't the mode you're browsing in.

0 / 14 solved · 4 articles
  1. 1. Why fork Plus Threads Is Genuinely Dangerous Read
  2. 2. Pool vs ProcessPoolExecutor, and the chunksize Trap Read
  3. 3. Debugging Hangs, Zombies and Dead Workers Read
  4. 4. What Subinterpreters Cost, and What They Cannot Do Read
  5. 5. Not solved yet. Sizing the Pool: process_cpu_count, cgroups, Oversubscription
  6. 6. Not solved yet. Process Is a Typing Black Hole — Prefer Executors
  7. 7. Not solved yet. Migrating a Fork-Dependent Codebase to Forkserver
  8. 8. Not solved yet. Free-Threading: Writing Code That Survives It
  9. 9. Not solved yet. Typing Multiprocessing: Where the Annotations Lie to You
  10. 10. Not solved yet. Zero-Copy IPC With Pickle Protocol 5 Out-of-Band Buffers
  11. 11. Not solved yet. Graceful Shutdown of a Process Pool
  12. 12. Not solved yet. What Actually Crosses a Process Boundary
  13. 13. Not solved yet. Queue Mechanics: The Feeder Thread and the Join Deadlock
  14. 14. Not solved yet. Manager and Proxies: Convenience at 275x the Price
  15. 15. Not solved yet. shared_memory, the Resource Tracker, and track=
  16. 16. Not solved yet. The Three Start Methods, and What 3.14 Changed
  17. 17. Not solved yet. Subinterpreters: PEP 734 and the Typed Queue
  18. 18. Not solved yet. Worker Recycling: max_tasks_per_child Without the Silent Downgrade

Check yourself

4 questions · one attempt each

These do not count toward finishing the track. They are here to catch the things that are easy to read past.

0 / 4

Why does passing a lambda to a ProcessPoolExecutor fail?

with ProcessPoolExecutor() as ex:
    ex.map(lambda x: x * 2, data)
Question 1 of 4