2013-01-14 33 views
2

據我瞭解,gevent中池的概念是隨時將併發請求的總數限制在數據庫或API或類似的地方。產生比您在gevent池中更多的線程

說我有這樣的代碼我在哪裏產卵多greenlets比我在Pool房間:

import gevent.pool 

pool = gevent.pool.Pool(50) 
jobs = [] 
for number in xrange(300): 
    jobs.append(pool.spawn(do_something, number)) 

total_result = [x.get() for x in jobs] 

什麼是試圖產卵51請求時的實際行爲?何時處理了第51個請求?

回答

6

池類使用信號量來算活躍greenlets,與size計數在構造函數中初始化:

class Pool(Group): 

    def __init__(self, size=None, greenlet_class=None): 
     if size is not None and size < 1: 
      raise ValueError('Invalid size for pool (positive integer or None required): %r' % (size,)) 
     Group.__init__(self) 
     self.size = size 
     if greenlet_class is not None: 
      self.greenlet_class = greenlet_class 
     if size is None: 
      self._semaphore = DummySemaphore() 
     else: 
      self._semaphore = Semaphore(size) 

每次spawn()被調用,它試圖獲取信號:

def spawn(self, *args, **kwargs): 
     self._semaphore.acquire() 
     try: 
      greenlet = self.greenlet_class.spawn(*args, **kwargs) 
      self.add(greenlet) 
     except: 
      self._semaphore.release() 
      raise 
     return greenlet 

如果池已滿,被調用的greenlet將因此等待_semaphore.acquire()調用。

def discard(self, greenlet): 
     Group.discard(self, greenlet) 
     self._semaphore.release() 

所以你的情況,我會想到的第51請求被處理(或開始,要準確),只要任何第50個請求:每當任何greenlets的執行結束信號被釋放已經完成了。