the problems with multiprocessing as threads domultiprocessing also has problemssome of which we have already discussed there is no best way to do concurrencythis is especially true in python we always need to examine the parallel problem to figure out which of the many available solutions is the best one for that problem sometimesthere is no best solution in the case of multiprocessingthe primary drawback is that sharing data between processes is very costly as we have discussedall communication between processeswhether by queuespipesor more implicit mechanism requires pickling the objects excessive pickling quickly dominates processing time multiprocessing works best when relatively small objects are passed between processes and tremendous amount of work needs to be done on each one on the other handif no communication between processes is requiredthere may not be any point in using the module at allwe can spin up four separate python processes and use them independently the other major problem with multiprocessing is thatlike threadsit can be hard to tell which process variable or method is being accessed in in multiprocessingif you access variable from another process it will usually overwrite the variable in the currently running process while the other process keeps the old value this is really confusing to maintainso don' do it futures let' start looking at more asynchronous way of doing concurrency futures wrap either multiprocessing or threading depending on what kind of concurrency we need (tending towards / versus tending towards cputhey don' completely solve the problem of accidentally altering shared statebut they allow us to structure our code such that it is easier to track down when we do so futures provide distinct boundaries between the different threads or processes similar to the multiprocessing poolthey are useful for "call and answertype interactions in which processing can happen in another thread and then at some point in the future (they are aptly namedafter all)you can ask it for the result it' really just wrapper around multiprocessing pools and thread poolsbut it provides cleaner api and encourages nicer code future is an object that basically wraps function call that function call is run in the background in thread or process the future object has methods to check if the future has completed and to get the results after it has completed