class AEntitySource(Greenlet, IASyncProducer): """ Simple asynchronous entity producer """ def __init__(self, name, types, maxQueueSize=None): Greenlet.__init__(self) self._name = name self._id = EntitySources.getSourceID(name) self._output = Queue(maxQueueSize) self._started = False self._maxQueueSize = maxQueueSize self.subcategories = types self.categories = set() # validate the types for t in types: if not t in Constants.subcategories: raise AttributeError("Source subcategory '%s' not supported" % t) self.categories.add(Entity.mapSubcategoryToCategory(t)) def get(self, block=True, timeout=None): return self._output.get(block, timeout) def get_nowait(self): return self._output.get_nowait() def empty(self): return self._output.empty() def next(self): return self._output.next() def startProducing(self): if not self._started: self._started = True self.start() @abstract def _run(self): """Subclasses should override to process the pull-based loop in the context of this sink's Greenlet.""" pass #utils.log("") #utils.log("Importing entities from source '%s'" % self.name) #utils.log("") @property def name(self): return self._name @property def maxQueueSize(self): return self._maxQueueSize @abstract def getMaxNumEntities(self): raise NotImplementedError def __str__(self): return self.name