池類使用信號量來算活躍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的執行結束信號被釋放已經完成了。