Simple Example

Create a Job Class

This example creates a job that will waste a specified amount of time, while randomly logging approximately 10 messages

from marshmallow import fields
import random
import time
import zerog

class WasteTimeJobSchema(zerog.BaseJobSchema):
    delay = fields.Integer()


class WasteTimeJob(zerog.BaseJob):
    JOB_TYPE = "waste_time"
    SCHEMA = WasteTimeJobSchema

    def __init__(self, *args, **kwargs):
        super(WasteTimeJob, self).__init__(*args, **kwargs)
        self.delay = kwargs.get('delay', 30)

    def run(self):
        end = time.time() + self.delay
        logInterval = self.delay / 10

        while True:
            if time.time() > end:
                break

            logDelay = (random.random() + 0.5) * logInterval
            time.sleep(logDelay)
            self.add_to_completeness(logDelay / self.delay)
            self.job_log_info(f"{end - time.time():.2f} seconds remaining")

        return 200, None

Create a ZeroG Service

Creating a ZeroG service is as simple as creating a new zerog.Server instance.

import tornado.ioloop
import zerog

import logging
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - "
           "%(message)s - [%(process)s:%(name)s:%(funcName)s]"
)
log = logging.getLogger(__name__)


def make_datastore():
    return zerog.CouchbaseDatastore(
        "couchbase", "Administrator", "password", "test"
    )


def make_queue(queueName):
    return zerog.BeanstalkdQueue("beanstalkd", 11300, queueName)


handlers = [
    (f"/job/{zerog.JOB_TYPE_PATT}", zerog.RunJobHandler),
    (f"/progress/{zerog.UUID_PATT}", zerog.ProgressHandler),
    (f"/info/{zerog.UUID_PATT}", zerog.InfoHandler),
    (f"/data/{zerog.UUID_PATT}", zerog.GetDataHandler)
]

server = zerog.Server(
    "myService",
    make_datastore,
    make_queue,
    [WasteTimeJob],
    handlers
)
server.listen(8888)
tornado.ioloop.IOLoop.current().start()