Skip to main content

Looper is a daemonizer library, it can help you with lifecycle of your daemon.

Project description

GenesisCoreLibs Looper Documentation

Overview

GCL Looper is a Python library designed to create daemon-like services that can run indefinitely, performing tasks at regular intervals or on demand.

Usage Examples

Basic Service

  • Iterate infinitely
  • There should be at least 5 seconds between start of previous and next iteration (iter_min_period)
  • pause for 1 second between iterations (iter_pause)
from gcl_looper.services import basic

class MyService(basic.BasicService):
    def __init__(self, iter_min_period=5, iter_pause=1):
        super(MyService, self).__init__(iter_min_period, iter_pause)

    def _iteration(self):
        print("Iteration", self._iteration_number)

service = MyService()
service.start()

Finite Service without any pauses in-between

from gcl_looper.services import basic

class MyFiniteService(basic.BasicService):
    def __init__(self, iter_min_period=0, iter_pause=0):
        super(MyFiniteService, self).__init__(iter_min_period, iter_pause)
        self.countdown = 3

    def _iteration(self):
        if self.countdown > 1:
            self.countdown -= 1
        else:
            self.stop()

service = MyFiniteService()
service.start()

API service with database (restalchemy)

from gcl_looper.services import bjoern_service
from gcl_looper.services import hub
from oslo_config import cfg
from restalchemy.storage.sql import engines
from restalchemy.common import config_opts as db_config_opts

from MY_PACKAGE.user_api import app

api_cli_opts = [
    cfg.StrOpt(
        "bind-host", default="127.0.0.1", help="The host IP to bind to"
    ),
    cfg.IntOpt("bind-port", default=8080, help="The port to bind to"),
    cfg.IntOpt(
        "workers", default=1, help="How many http servers should be started"
    ),
]

DOMAIN = "user_api"

CONF = cfg.CONF
CONF.register_cli_opts(api_cli_opts, DOMAIN)
db_config_opts.register_posgresql_db_opts(conf=CONF)


def main():

    serv_hub = hub.ProcessHubService()

    for _ in range(CONF[DOMAIN].workers):
        service = bjoern_service.BjoernService(
            wsgi_app=app.build_wsgi_application(),
            host=CONF[DOMAIN].bind_host,
            port=CONF[DOMAIN].bind_port,
            bjoern_kwargs=dict(reuse_port=True),
        )

        service.add_setup(
            lambda: engines.engine_factory.configure_postgresql_factory(
                conf=CONF
            )
        )

        serv_hub.add_service(service)

    serv_hub.start()


if __name__ == "__main__":
    main()

Public interface:

  • start(): Starts the service.
  • stop(): Stop the service.
  • _loop_iteration(): Performs one iteration of the service loop.

Implement these methods to get usable service:

  • _iteration(): This method must be implemented by subclasses to perform the actual work at each iteration.

Launchpad Service

Launchpad service is a service that can run multiple services and execute them sequentially. It's convenient when you have multiple services that need to be run in a specific order or the services aren't heavy and you don't want to use multiprocessing. Also it simplifies the configuration of the services.

Basic usage:

from gcl_looper.services import launchpad

services = [
    MyService(),
    MyFiniteService(),
]

service = launchpad.LaunchpadService(services)
service.start()

The most important part in the launchpad service is its configuration. In the configuration you specify how to run inner services, how to configure them and how to initialize them.

Configuration options:

  • services: List of services to run. Each service can be specified as a string in the format module.path:ServiceName::count where count is optional and defaults to 1.
  • common_registrator_opts: Common options for all services. These options are passed to the service constructor.
  • common_initializer: Common initializer for all services. This initializer is called after the service is created and before it is started.
  • iter_min_period: Minimum period between iterations of the service loop.
  • iter_pause: Pause between iterations of the service loop.

Example:

[DEFAULT]
verbose = True
debug = True

[launchpad]
services =
    my_package.service_foo:FooService,
    my_package.service_bar:BarService,
    my_package.service_baz:BazService
common_registrator_opts = my_package.service_common:common_opts
common_initializer = my_package.service_common:common_init

[my_package.service_foo:FooService]
name = foo

[my_package.service_bar:BarService]
name = bar
project_id = 123

[my_package.service_baz:BazService]
param1 = value1
param2 = value2

Example with multiple instances of the same service:

[DEFAULT]
verbose = True
debug = True

[launchpad]
services =
    my_package.service_foo:FooService,
    my_package.service_bar:BarService::2

[my_package.service_foo:FooService]
name = foo

[my_package.service_bar:BarService::0]
name = bar0
project_id = 123

[my_package.service_bar:BarService::1]
name = bar1
project_id = 456

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gcl_looper-1.1.1.tar.gz (21.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gcl_looper-1.1.1-py3-none-any.whl (29.3 kB view details)

Uploaded Python 3

File details

Details for the file gcl_looper-1.1.1.tar.gz.

File metadata

  • Download URL: gcl_looper-1.1.1.tar.gz
  • Upload date:
  • Size: 21.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for gcl_looper-1.1.1.tar.gz
Algorithm Hash digest
SHA256 c1ffcb8cbca182611443af4899f0c19f141a809e392a2c3d9f3448c413707d24
MD5 7dc54e2a7af30f8ee407b2ea560d2dbf
BLAKE2b-256 2dec1d773f1c27d4be1998aed53faee89afa64b658f0d372db008503ce8ba1aa

See more details on using hashes here.

Provenance

The following attestation bundles were made for gcl_looper-1.1.1.tar.gz:

Publisher: publish-to-pypi.yml on infraguys/gcl_looper

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file gcl_looper-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: gcl_looper-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 29.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for gcl_looper-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2106844c0339e910b312b6b78a9769575b3a999a52059ee61418b53ddd259155
MD5 c8ac16057201d931d25004a4241773fc
BLAKE2b-256 322c556686feac3ad84c50effcb9de977aa5fff53605a39938ebf1ebfb6c4996

See more details on using hashes here.

Provenance

The following attestation bundles were made for gcl_looper-1.1.1-py3-none-any.whl:

Publisher: publish-to-pypi.yml on infraguys/gcl_looper

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page