work in progress: cybertools.agent - more on base and sample implementations

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2415 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-02-24 15:04:13 +00:00
parent f56e98b2ee
commit 9a5264f374
6 changed files with 64 additions and 11 deletions

View file

@ -146,9 +146,19 @@ Let's check a few attributes of the newly created agent.
Job Scheduling and Execution
----------------------------
A scheduler is responsible for triggering the execution of a job at the
appropriate time. The master agent schedules the jobs based upon the
information (job specifications) it gets from the controller. There
is just one scheduler associated with the master agent.
>>> master.scheduler
<cybertools.agent.base.schedule.Scheduler object ...>
>>> from cybertools.agent.base.control import JobSpecification
>>> jobSpec = JobSpecification('sample', agent='sample01')
>>> master.setupJobs([jobSpec])
Job <...Job object ...> on agent <...SampleAgent object ...> has been executed.
Logging
-------

View file

@ -25,8 +25,8 @@ $Id$
from zope.interface import implements
from cybertools.agent.interfaces import IAgent
from cybertools.agent.components import agents
from cybertools.agent.components import controllers, loggers, schedulers
from cybertools.agent.components import agents, controllers, jobs
from cybertools.agent.components import loggers, schedulers
from cybertools.util.config import Configurator
@ -72,12 +72,16 @@ class Master(Agent):
self.children[spec.name] = agent
def setupJobs(self, jobSpecs):
pass
for spec in jobSpecs:
job = jobs(self.scheduler, spec.type)
job.agent = self.children[spec.agent]
self.scheduler.schedule(job, spec.startTime)
class SampleAgent(Agent):
pass
def execute(self, job, params=None):
print 'Job %s on agent %s has been executed.' % (job, self)
agents.register(SampleAgent, Master, name='sample')

View file

@ -66,8 +66,9 @@ class AgentSpecification(object):
class JobSpecification(object):
def __init__(self, name, type, **kw):
self.name = name
startTime = None
def __init__(self, type, **kw):
self.type = type
for k, v in kw.items():
setattr(self, k, v)

View file

@ -23,10 +23,38 @@ $Id$
"""
from zope.interface import implements
from loops.agent.interfaces import IScheduledJob
from cybertools.agent.base.schedule import Scheduler
from cybertools.agent.components import jobs
from cybertools.agent.interfaces import IScheduledJob
class Job(object):
implements(IScheduledJob)
agent = None
startTime = None
repeat = 0
whenStarted = whenFinished = None
def __init__(self, scheduler):
self.scheduler = scheduler
self.params = {}
self.successors = []
def execute(self):
if self.agent is not None:
self.agent.execute(self, self.params)
def reschedule(self, startTime=None):
self.scheduler.schedule(self.copy(), startTime)
def copy(self):
newJob = Job(self.scheduler)
newJob.agent = self.agent
newJob.params = self.params
newJob.repeat = self.repeat
newJob.successors = [s.copy() for s in self.successors]
jobs.register(Job, Scheduler, name='sample')

View file

@ -1,5 +1,5 @@
#
# Copyright (c) 2007 Helmut Merz helmutm@cy55.de
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -22,7 +22,7 @@ Basic (sample) job scheduler.
$Id$
"""
from time import time
from zope.interface import implements
from cybertools.agent.base.agent import Master
@ -36,6 +36,15 @@ class Scheduler(object):
def __init__(self, agent):
self.agent = agent
self.queue = []
def schedule(self, job, startTime=None):
job. startTime = startTime or int(time())
self.queue.append(job)
job.execute() # the sample scheduler does not care about startTime
def getJobsToExecute(startTime=0):
return [j for j in self.queue.values() if startTime <= j.startTime]
schedulers.register(Scheduler, Master, name='sample')

View file

@ -127,7 +127,7 @@ class IScheduler(Interface):
time by the agents responsible for it.
"""
def schedule(job, agent, startTime=None):
def schedule(job, startTime=None):
""" Register the job given for execution at the intended start
date/time (an integer timestamp) and return the job.
@ -154,6 +154,7 @@ class IScheduledJob(Interface):
a predefined date and time - this is the basic job interface.
"""
scheduler = Attribute('Scheduler that controls this job.')
agent = Attribute('Agent responsible for executing the job.')
startTime = Attribute('Date/time at which the job should be executed.')
params = Attribute('Mapping with key/value pairs to be used by '
@ -168,7 +169,7 @@ class IScheduledJob(Interface):
'result of running the job, that will be called when '
'the job has finished.')
def execute(params=None):
def execute():
""" Execute the job, typically by calling the ``execute()`` method
of the agent responsible for it.
"""