title: Parallelism in Python
body: <p>What are the options for achieving parallelism in Python?  I want to perform a bunch of CPU bound calculations over some very large rasters, and would like to parallelise them.  Coming from a C background, I am familiar with three approaches to parallelism:</p>
  
  <ol>
  <li>Message passing processes, possibly distributed across a cluster, e.g. <em>MPI</em>.</li>
  <li>Explicit shared memory parallelism, either using <em>pthreads</em> or <em>fork()</em>, <em>pipe()</em>, et. al</li>
  <li>Implicit shared memory parallelism, using <em>OpenMP</em>.</li>
  </ol>
  
  <p>Deciding on an approach to use is an exercise in trade-offs.</p>
  
  <p>In Python, what approaches are available and what are their characteristics?  Is there a clusterable <em>MPI</em> clone?  What are the preferred ways of achieving shared memory parallelism?  I have heard reference to problems with the <em>GIL</em>, as well as references to <em>tasklets</em>.  </p>
  
  <p>In short, what do I need to know about the different parallelization strategies in Python before choosing between them?</p>