Files

42 lines
1.1 KiB
Python

"""Background worker: drains a queue of jobs."""
import argparse
import logging
import time
from collections import deque
log = logging.getLogger("worker")
def process(job: dict) -> str:
kind = job.get("kind")
if kind == "email":
return f"sent email to {job['to']}"
if kind == "report":
return f"built report {job['name']}"
raise ValueError(f"unknown job kind: {kind!r}")
def run(queue: deque, once: bool = False) -> int:
done = 0
while queue:
job = queue.popleft()
try:
log.info(process(job))
done += 1
except ValueError as e: # TODO: dead-letter queue
log.warning("skipping job: %s", e)
if once:
break
time.sleep(0.01)
return done
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--once", action="store_true")
args = parser.parse_args()
logging.basicConfig(level=logging.INFO)
jobs = deque([{"kind": "email", "to": "dev@example.com"}, {"kind": "report", "name": "weekly"}, {"kind": "?"}])
print(f"processed {run(jobs, args.once)} job(s)")