async def test_defer(pg_app, aiopg_connector): sum_results = [] product_results = [] @pg_app.task(queue="default", name="sum_task") def sum_task(a, b): sum_results.append(a + b) @pg_app.task(queue="default", name="product_task") async def product_task(a, b): product_results.append(a * b) sum_task.defer(a=1, b=2) sum_task.configure().defer(a=3, b=4) pg_app.configure_task(name="sum_task").defer(a=5, b=6) product_task.defer(a=3, b=4) async_app = procrastinate.App(connector=aiopg_connector) async_app.tasks = pg_app.tasks await async_app.run_worker_async(queues=["default"], wait=False) assert sum_results == [3, 7, 11] assert product_results == [12]
def cli( ctx: click.Context, app: str, verbose: int, log_format: str, log_format_style: Style, ) -> None: """ Interact with a Procrastinate app. See subcommands for details. All arguments can be passed by environment variables: PROCRASTINATE_UPPERCASE_NAME or PROCRASTINATE_COMMAND_UPPERCASE_NAME (examples: PROCRASTINATE_APP, PROCRASTINATE_DEFER_UNKNOWN, ...). """ configure_logging(verbosity=verbose, format=log_format, style=log_format_style) if app: app_obj = procrastinate.App.from_path(dotted_path=app) else: # If we don't provide an app, initialize a default one that will fail if it # needs a connector. app_obj = procrastinate.App(connector=MissingAppConnector()) app_obj.open() ctx.obj = app_obj worker_defaults = app_obj.worker_defaults.copy() worker_defaults["queues"] = ",".join(worker_defaults.get("queues") or []) ctx.default_map = {"worker": worker_defaults}
def cli(ctx: click.Context, app: str, **kwargs) -> None: """ Interact with a Procrastinate app. See subcommands for details. All arguments can be passed by environment variables: PROCRASTINATE_UPPERCASE_NAME or PROCRASTINATE_COMMAND_UPPERCASE_NAME (examples: PROCRASTINATE_APP, PROCRASTINATE_DEFER_UNKNOWN, ...). """ if app: ctx.obj = procrastinate.App.from_path(dotted_path=app) else: # If we don't provide an app, initialize a default one that will fail if it # needs its job store. ctx.obj = procrastinate.App(job_store=procrastinate.BaseJobStore())
def cli(ctx: click.Context, app: str, **kwargs) -> None: """ @handle_errors() Interact with a Procrastinate app. See subcommands for details. All arguments can be passed by environment variables: PROCRASTINATE_UPPERCASE_NAME or PROCRASTINATE_COMMAND_UPPERCASE_NAME (examples: PROCRASTINATE_APP, PROCRASTINATE_DEFER_UNKNOWN, ...). """ if app: app_obj = procrastinate.App.from_path(dotted_path=app) else: # If we don't provide an app, initialize a default one that will fail if it # needs its job store. app_obj = procrastinate.App(connector=connector.BaseConnector()) ctx.obj = app_obj worker_defaults = app_obj.worker_defaults.copy() worker_defaults["queues"] = ",".join(worker_defaults.get("queues") or []) ctx.default_map = {"worker": worker_defaults}
import procrastinate app = procrastinate.App( connector=procrastinate.AiopgConnector(), import_paths=["procrastinate_demo.tasks"], )
import procrastinate app = procrastinate.App( job_store=procrastinate.PostgresJobStore( dsn="postgresql://postgres@localhost/procrastinate" ), import_paths=["procrastinate_demo.tasks"], )
def pg_app(psycopg2_connector): return procrastinate.App(connector=psycopg2_connector)
import procrastinate import_paths = ["procrastinate_demo.tasks"] connector_class = procrastinate.AiopgConnector # connector_class = procrastinate.Psycopg2Connector app = procrastinate.App(connector=connector_class(listen_notify=False), import_paths=import_paths)
import procrastinate import_paths = ["procrastinate_demo.tasks"] is_async = False # set to True to run async demo if is_async: connector_class = procrastinate.AiopgConnector else: connector_class = procrastinate.Psycopg2Connector app = procrastinate.App( connector=connector_class(), import_paths=import_paths, worker_defaults={"listen_notify": False}, ) app.open()
def pg_app(aiopg_connector): return procrastinate.App(connector=aiopg_connector)
from typing import Type import procrastinate USE_ASYNC = True import_paths = ["procrastinate_demo.tasks"] connector_class: Type[procrastinate.BaseConnector] if USE_ASYNC: connector_class = procrastinate.AiopgConnector else: connector_class = procrastinate.Psycopg2Connector app = procrastinate.App(connector=connector_class(), import_paths=import_paths) app.open()
async def async_app_context_manager(not_opened_aiopg_connector): async with procrastinate.App( connector=not_opened_aiopg_connector ).open_async() as app: yield app
def sync_app_explicit_open(not_opened_psycopg2_connector): app = procrastinate.App(connector=not_opened_psycopg2_connector).open() yield app app.close()
def sync_app_context_manager(not_opened_psycopg2_connector): with procrastinate.App(connector=not_opened_psycopg2_connector).open() as app: yield app
return obj.p raise TypeError() def decode(dct): if "p1" in dct: dct["p1"] = Param(dct["p1"]) if "p2" in dct: dct["p2"] = Param(dct["p2"]) return dct json_dumps = functools.partial(json.dumps, default=encode) json_loads = functools.partial(json.loads, object_hook=decode) app = procrastinate.App(connector=procrastinate.AiopgConnector( json_dumps=json_dumps, json_loads=json_loads)) sync_app = procrastinate.App(connector=procrastinate.Psycopg2Connector( json_dumps=json_dumps, json_loads=json_loads)) @app.task(queue="default") def sum_task(a, b): print(a + b) @app.task(queue="default") def sum_task_param(p1: Param, p2: Param): if not isinstance(p1, Param): raise Exception("wrong type for p1") if not isinstance(p2, Param):
raise TypeError() def decode(dct): if "p1" in dct: dct["p1"] = Param(dct["p1"]) if "p2" in dct: dct["p2"] = Param(dct["p2"]) return dct json_dumps = functools.partial(json.dumps, default=encode) json_loads = functools.partial(json.loads, object_hook=decode) app = procrastinate.App( connector=procrastinate.AiopgConnector(json_dumps=json_dumps, json_loads=json_loads) ) @app.task(queue="default") def sum_task(a, b): print(a + b) @app.task(queue="default") def sum_task_param(p1: Param, p2: Param): if not isinstance(p1, Param): raise Exception("wrong type for p1") if not isinstance(p2, Param): raise Exception("wrong type for p2") print(p1 + p2)
import time import procrastinate app = procrastinate.App(job_store=procrastinate.PostgresJobStore()) @app.task(queue="default") def sum_task(a, b): print(a + b) @app.task() def increment_task(a): print(a + 1) @app.task(queue="product_queue") def product_task(a, b): print(a * b) nb_tries = 0 @app.task(queue="retry", retry=10) def two_fails(): global nb_tries if nb_tries < 2: nb_tries += 1 raise Exception("This should fail")