Commits

Anonymous committed ff64582 Merge

Merge wih which_linden tip

Comments (0)

Files changed (5)

doc/basic_usage.rst

    
 .. function:: eventlet.spawn_n(func, *args, **kw)
    
-   The same as :func:`spawn`, but it's not possible to retrieve the return value.  This makes execution faster.  See :func:`spawn_n <eventlet.greenthread.spawn_n>` for more details.
+   The same as :func:`spawn`, but it's not possible to know how the function terminated (i.e. no return value or exceptions).  This makes execution faster.  See :func:`spawn_n <eventlet.greenthread.spawn_n>` for more details.
 
 .. function:: eventlet.spawn_after(seconds, func, *args, **kw)
    

doc/real_index.html

 <div class="section" id="web-crawler-example">
 <h2>Web Crawler Example<a class="headerlink" href="#web-crawler-example" title="Permalink to this headline">¶</a></h2>
 <p>This is a simple web &#8220;crawler&#8221; that fetches a bunch of urls using a coroutine pool.  It has as much concurrency (i.e. pages being fetched simultaneously) as coroutines in the pool.</p>
+
 <div class="highlight-python"><div class="highlight"><pre><span class="n">urls</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;http://www.google.com/intl/en_ALL/images/logo.gif&quot;</span><span class="p">,</span>
-       <span class="s">&quot;http://wiki.secondlife.com/w/images/secondlife.jpg&quot;</span><span class="p">,</span>
-       <span class="s">&quot;http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif&quot;</span><span class="p">]</span>
+     <span class="s">&quot;https://wiki.secondlife.com/w/images/secondlife.jpg&quot;</span><span class="p">,</span>
+     <span class="s">&quot;http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif&quot;</span><span class="p">]</span>
 
-<span class="kn">import</span> <span class="nn">time</span>
-<span class="kn">from</span> <span class="nn">eventlet</span> <span class="kn">import</span> <span class="n">coros</span>
-
-<span class="c"># this imports a special version of the urllib2 module that uses non-blocking IO</span>
+<span class="kn">import</span> <span class="nn">eventlet</span>
 <span class="kn">from</span> <span class="nn">eventlet.green</span> <span class="kn">import</span> <span class="n">urllib2</span>
 
 <span class="k">def</span> <span class="nf">fetch</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
-    <span class="k">print</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> fetching </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">asctime</span><span class="p">(),</span> <span class="n">url</span><span class="p">)</span>
-    <span class="n">data</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
-    <span class="k">print</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> fetched </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">asctime</span><span class="p">(),</span> <span class="n">data</span><span class="p">)</span>
 
-<span class="n">pool</span> <span class="o">=</span> <span class="n">coros</span><span class="o">.</span><span class="n">CoroutinePool</span><span class="p">(</span><span class="n">max_size</span><span class="o">=</span><span class="mf">4</span><span class="p">)</span>
-<span class="n">waiters</span> <span class="o">=</span> <span class="p">[]</span>
-<span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">urls</span><span class="p">:</span>
-    <span class="n">waiters</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pool</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">fetch</span><span class="p">,</span> <span class="n">url</span><span class="p">))</span>
+  <span class="k">return</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
 
-<span class="c"># wait for all the coroutines to come back before exiting the process</span>
-<span class="k">for</span> <span class="n">waiter</span> <span class="ow">in</span> <span class="n">waiters</span><span class="p">:</span>
-    <span class="n">waiter</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
+<span class="n">pool</span> <span class="o">=</span> <span class="n">eventlet</span><span class="o">.</span><span class="n">GreenPool</span><span class="p">()</span>
+
+<span class="k">for</span> <span class="n">body</span> <span class="ow">in</span> <span class="n">pool</span><span class="o">.</span><span class="n">imap</span><span class="p">(</span><span class="n">fetch</span><span class="p">,</span> <span class="n">urls</span><span class="p">):</span>
+  <span class="k">print</span> <span class="s">&quot;got body&quot;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">body</span><span class="p">)</span>
 </pre></div>
 
 <h3>Stats</h3>

eventlet/greenpool.py

 
 __all__ = ['GreenPool', 'GreenPile']
 
-DEBUG = False
+DEBUG = True
 
 class GreenPool(object):
     """The GreenPool class is a pool of green threads.

eventlet/greenthread.py

 
 
 def spawn_n(func, *args, **kwargs):
-    """Same as :func:`spawn`, but returns a ``greenlet`` object from which it is 
-    not possible to retrieve the results.  This is faster than :func:`spawn`;
-    it is fastest if there are no keyword arguments."""
+    """Same as :func:`spawn`, but returns a ``greenlet`` object from
+    which it is not possible to retrieve either a return value or
+    whether it raised any exceptions.  This is faster than
+    :func:`spawn`; it is fastest if there are no keyword arguments.
+    
+    If an exception is raised in the function, spawn_n prints a stack
+    trace; the print can be disabled by calling
+    :func:`eventlet.debug.hub_exceptions` with False.
+    """
     return _spawn_n(0, func, args, kwargs)[1]
     
     

tests/tpool_test.py

 
     @skip_with_pyevent
     def test_wrap_iterator(self):
+        self.reset_timeout(2)
         prox = tpool.Proxy(xrange(10))
         result = []
         for i in prox:
         def tick():
             for i in xrange(20000):
                 counter[0]+=1
-                eventlet.sleep()
+                if counter[0] % 20 == 0:
+                    eventlet.sleep(0.0001)
+                else:
+                    eventlet.sleep()
                 
         gt = eventlet.spawn(tick)
         previtem = 0
             self.assert_(item >= previtem)
         # make sure the tick happened at least a few times so that we know
         # that our iterations in foo() were actually tpooled
+        print counter[0]
         self.assert_(counter[0] > 10, counter[0])
-        gt.wait()
-
+        gt.kill()
 
     @skip_with_pyevent
     def test_raising_exceptions(self):