<ul data-eligibleForWebStory="true">The author found Celery and Cron to be inadequate for task scheduling in Python.They developed a basic, non-blocking task runner using asyncio.The approach allowed mixing async with blocking logic without freezing the main event loop.The main thread can run the task runner or be spun off into its own daemon thread.They utilized a pattern to handle transient failures like network blips or file locks.The system provided predictable teardown behavior when running as a service.Every job now runs with full visibility, eliminating the need to grep logs.The architecture supported running over 10k jobs per week in production with minimal issues.The project was rewarding and educational, offering insights into Python's concurrency.It emphasized leveraging Python's core primitives to build powerful systems tailored to specific use cases.The author encouraged others to try this approach for scheduling background tasks, starting small and growing iteratively.Automation is highlighted as a means of both saving time and reclaiming control.