2010-09-03 15:54:42 -03:00
|
|
|
from zope.interface import implements
|
2010-12-10 15:55:40 -02:00
|
|
|
from twisted.internet.defer import DeferredQueue, inlineCallbacks, maybeDeferred, returnValue
|
2010-09-03 15:54:42 -03:00
|
|
|
|
|
|
|
from .utils import get_spider_queues
|
|
|
|
from .interfaces import IPoller
|
|
|
|
|
|
|
|
class QueuePoller(object):
|
|
|
|
|
|
|
|
implements(IPoller)
|
|
|
|
|
|
|
|
def __init__(self, config):
|
2010-09-22 01:04:15 -03:00
|
|
|
self.config = config
|
2010-09-03 15:54:42 -03:00
|
|
|
self.update_projects()
|
|
|
|
self.dq = DeferredQueue(size=1)
|
|
|
|
|
2010-12-10 15:55:40 -02:00
|
|
|
@inlineCallbacks
|
2010-09-03 15:54:42 -03:00
|
|
|
def poll(self):
|
|
|
|
if self.dq.pending:
|
|
|
|
return
|
|
|
|
for p, q in self.queues.iteritems():
|
2010-12-10 15:55:40 -02:00
|
|
|
c = yield maybeDeferred(q.count)
|
|
|
|
if c:
|
|
|
|
msg = yield maybeDeferred(q.pop)
|
|
|
|
returnValue(self.dq.put(self._message(msg, p)))
|
2010-09-03 15:54:42 -03:00
|
|
|
|
|
|
|
def next(self):
|
|
|
|
return self.dq.get()
|
|
|
|
|
|
|
|
def update_projects(self):
|
2010-09-22 01:04:15 -03:00
|
|
|
self.queues = get_spider_queues(self.config)
|
2010-09-03 15:54:42 -03:00
|
|
|
|
2010-11-29 17:19:05 -02:00
|
|
|
def _message(self, queue_msg, project):
|
|
|
|
d = queue_msg.copy()
|
2010-11-30 13:03:20 -02:00
|
|
|
d['_project'] = project
|
|
|
|
d['_spider'] = d.pop('name')
|
2010-11-29 17:19:05 -02:00
|
|
|
return d
|