Commit df8493be authored by Denis Bilenko's avatar Denis Bilenko

pool: proper implementation of imap_unordered

parent 8c903808
...@@ -190,11 +190,8 @@ class Group(object): ...@@ -190,11 +190,8 @@ class Group(object):
def imap_unordered(self, func, iterable): def imap_unordered(self, func, iterable):
"""The same as imap() except that the ordering of the results from the """The same as imap() except that the ordering of the results from the
returned iterator should be considered arbitrary. returned iterator should be considered in arbitrary order."""
return IMapUnordered.spawn(self.spawn, func, iterable)
**TODO**: Fix this.
"""
return iter(self.map(func, iterable))
def full(self): def full(self):
return False return False
...@@ -203,6 +200,39 @@ class Group(object): ...@@ -203,6 +200,39 @@ class Group(object):
pass pass
class IMapUnordered(Greenlet):
def __init__(self, spawn, func, iterable):
from gevent.queue import Queue
Greenlet.__init__(self)
self.spawn = spawn
self.func = func
self.iterable = iterable
self.queue = Queue()
self.count = 0
def __iter__(self):
return self.queue
def _run(self):
try:
func = self.func
for item in self.iterable:
self.count += 1
self.spawn(func, item).rawlink(self._on_result)
finally:
self.__dict__.pop('spawn', None)
self.__dict__.pop('func', None)
self.__dict__.pop('iterable', None)
def _on_result(self, greenlet):
self.count -= 1
if greenlet.successful():
self.queue.put(greenlet.value)
if self.ready() and self.count <= 0:
self.queue.put(StopIteration)
def GreenletSet(*args, **kwargs): def GreenletSet(*args, **kwargs):
import warnings import warnings
warnings.warn("gevent.pool.GreenletSet was renamed to gevent.pool.Group since version 0.13.0", DeprecationWarning, stacklevel=2) warnings.warn("gevent.pool.GreenletSet was renamed to gevent.pool.Group since version 0.13.0", DeprecationWarning, stacklevel=2)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment