title: How can I raise exception in main thread when using eventlet.GreenPool.spawn
body: <p>I run some task using eventlet.GreenPool.spawn, then wait for all greanthreads to finish. I know there would be an exception raised - how can I catch that exception and throw it in a main thread? I am pretty sure it's easy however I'm totally missing something.</p>
  
  <p>Here is an example (which fails and I would like it to succeed)</p>
  
  <pre class="lang-py prettyprint-override"><code>import unittest
  import eventlet
  
  
  def broken_fetch(url):
      print " Raising exception "
      raise RuntimeError
  
  
  class TestPool(unittest.TestCase):
  
      def test_error_is_bubbled_up(self):
          with self.assertRaises(RuntimeError):
              pool = eventlet.GreenPool(100)
              urls = ['http://google.com/', 'http://example.com/']
              for url in urls:
                  pool.spawn(broken_fetch, url)
              pool.waitall()
  
  if __name__ == '__main__':
      unittest.main()
  </code></pre>
  
  <p>and it's output:</p>
  
  <pre><code>&gt; python errors.py
  Raising exception 
  Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/eventlet/hubs/hub.py", line 336, in fire_timers
      timer()
  File "/usr/local/lib/python2.7/site-packages/eventlet/hubs/timer.py", line 56, in __call__
      cb(*args, **kw)
  File "/usr/local/lib/python2.7/site-packages/eventlet/greenthread.py", line 192, in main
      result = function(*args, **kwargs)
  File "errors.py", line 10, in broken_fetch
      raise RuntimeError
  RuntimeError
  Raising exception 
  Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/eventlet/hubs/hub.py", line 336, in fire_timers
      timer()
  File "/usr/local/lib/python2.7/site-packages/eventlet/hubs/timer.py", line 56, in __call__
      cb(*args, **kw)
  File "/usr/local/lib/python2.7/site-packages/eventlet/greenthread.py", line 192, in main
      result = function(*args, **kwargs)
  File "errors.py", line 10, in broken_fetch
      raise RuntimeError
  RuntimeError
  F
  ======================================================================
  FAIL: test_error_is_bubbled_up (__main__.TestPool)
  ----------------------------------------------------------------------
  Traceback (most recent call last):
  File "errors.py", line 21, in test_error_is_bubbled_up
      pool.waitall()
  AssertionError: RuntimeError not raised
  
  ----------------------------------------------------------------------
  Ran 1 test in 0.003s
  
  FAILED (failures=1)
  </code></pre>