testing with py test one way to do setup and cleanup completely different way to set up variables skipping tests with py test imitating expensive objects how much testing is enoughcase study implementing it exercises summary concurrency shared memory the global interpreter lock threads the many problems with threads thread overhead multiprocessing multiprocessing pools queues the problems with multiprocessing futures asyncio asyncio in action reading an asyncio future asyncio for networking using executors to wrap blocking code streams case study exercises summary executors index vi