def test_start(self, pool): plugin = Mock(container=Mock()) builtin = Builtin(plugin) builtin.start() pool.return_value.start.assert_called_once_with()
class Scheduler(Thread): """ The pending request scheduler. Processes the *pending* queue. """ def __init__(self, plugin): """ :param plugin: A plugin. :type plugin: gofer.agent.plugin.Plugin """ Thread.__init__(self, name='scheduler:%s' % plugin.name) self.plugin = plugin self.pending = Pending(plugin.name) self.builtin = Builtin(plugin) self.setDaemon(True) def run(self): """ Read the pending queue and dispatch requests to the plugin thread pool. """ self.builtin.start() while not Thread.aborted(): try: request = self.pending.get() except Empty: # aborted break try: plugin = self.select_plugin(request) transaction = Transaction(plugin, self.pending, request) task = Task(transaction) plugin.pool.run(task) except Exception: self.pending.commit(request.sn) log.exception(request.sn) def select_plugin(self, request): """ Select the plugin based on the request. :param request: A request to be scheduled. :rtype request: gofer.messaging.Document :return: The appropriate plugin. :rtype: gofer.agent.plugin.Plugin """ call = Document(request.request) if self.builtin.provides(call.classname): plugin = self.builtin else: plugin = self.plugin return plugin def add(self, request): """ Add a request to be scheduled. :param request: A request to be scheduled. :rtype request: gofer.messaging.Document """ self.pending.put(request) def shutdown(self): """ Shutdown the scheduler. """ self.builtin.shutdown() self.abort()