threading module uses threads, the
multiprocessing module uses processes. The difference is that threads run in the same memory space, while processes have separate memory. This makes it a bit harder to share objects between processes with multiprocessing. Since threads use the same memory, precautions have to be taken or two threads will write to the same memory at the same time. This is what the global interpreter lock is for.
Spawning processes is a bit slower than spawning threads. Once they are running, there is not much difference.
Here are some pros/cons I came up with.
multiprocessingmodule includes useful abstractions with an interface much like
Queuemodule), then manual use of synchronization primitives become a necessity (decisions are needed for the granularity of locking)