xxiii the threading module functions passing arguments to thread extending the thread class daemon threads naming threads thread local data timers the global interpreter lock online resources exercise multiprocessing introduction the process class working with the process class alternative ways to start process using pool exchanging data between processes sharing state between processes process shared memory online resources exercises inter thread/process synchronisation introduction using barrier event signalling synchronising concurrent code python locks python conditions python semaphores the concurrent queue class online resources exercises futures introduction the need for future futures in python future creation simple example future running multiple futures waiting for all futures to complete processing results as completed