wglass/zoonado

View on GitHub
examples/lease.py

Summary

Maintainability
A
0 mins
Test Coverage
import datetime
import logging
import random

from tornado import gen, ioloop
from zoonado import exc


log = logging.getLogger()


def arguments(parser):
    parser.add_argument(
        "--path", "-p", type=str, default="/example-task-lease"
    )
    parser.add_argument(
        "--limit", "-l", type=int, default=1,
        help="Max number of simultaneous leases."
    )


@gen.coroutine
def run(client, args):
    yield client.start()

    try:
        yield client.create(args.path)
    except exc.NodeExists:
        pass

    # simulate a cron job, same task fired at an interval
    for i in range(8):
        ioloop.IOLoop.current().add_callback(limited_task, i, client, args)
        yield gen.sleep(1)


@gen.coroutine
def limited_task(number, client, args):
    lease = client.recipes.Lease(args.path, args.limit)

    seconds = random.choice([1, 2, 3])

    obtained = yield lease.obtain(duration=datetime.timedelta(seconds=seconds))
    if obtained:
        log.info("[ITERATION #%d] Got lease for %d seconds", number, seconds)
    else:
        log.info("[ITERATION #%d] No lease available, can't work", number)