title: Python Multiprocessing with a single function
body: <p>I have a simulation that is currently running, but the ETA is about 40 hours -- I'm trying to speed it up with multi-processing.</p>
  
  <p>It essentially iterates over 3 values of one variable (L), and over 99 values of of a second variable (a). Using these values, it essentially runs a complex simulation and returns 9 different standard deviations. Thus (even though I haven't coded it that way yet) it is essentially a function that takes two values as inputs (L,a) and returns 9 values.</p>
  
  <p>Here is the essence of the code I have:</p>
  
  <pre><code>STD_1 = []
  STD_2 = []
  # etc.
  
  for L in range(0,6,2):
      for a in range(1,100):
          ### simulation code ###
          STD_1.append(value_1)
          STD_2.append(value_2)
          # etc.
  </code></pre>
  
  <p>Here is what I can modify it to:</p>
  
  <pre><code>master_list = []
  
  def simulate(a,L):
      ### simulation code ###
      return (a,L,STD_1, STD_2 etc.)
  
  for L in range(0,6,2):
      for a in range(1,100): 
          master_list.append(simulate(a,L))
  </code></pre>
  
  <p>Since each of the simulations are independent, it seems like an ideal place to implement some sort of multi-threading/processing.</p>
  
  <p>How exactly would I go about coding this?</p>
  
  <p>EDIT: Also, will everything be returned to the master list in order, or could it possibly be out of order if multiple processes are working?</p>
  
  <p>EDIT 2: This is my code -- but it doesn't run correctly. It asks if I want to kill the program right after I run it.</p>
  
  <pre><code>import multiprocessing
  
  data = []
  
  for L in range(0,6,2):
      for a in range(1,100):
          data.append((L,a))
  
  print (data)
  
  def simulation(arg):
      # unpack the tuple
      a = arg[1]
      L = arg[0]
      STD_1 = a**2
      STD_2 = a**3
      STD_3 = a**4
      # simulation code #
      return((STD_1,STD_2,STD_3))
  
  print("1")
  
  p = multiprocessing.Pool()
  
  print ("2")
  
  results = p.map(simulation, data)
  </code></pre>
  
  <p>EDIT 3: Also what are the limitations of multiprocessing. I've heard that it doesn't work on OS X. Is this correct?</p>