0Pricing
AI Agents · บทเรียน

ตัวแทนตามกำหนดเวลาและ Cron

APScheduler งาน cron และการเรียกใช้ตัวแทนอัตโนมัติตามเวลา

ตัวแทนตามกำหนดเวลาและ Cron เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องจัดตารางเวลาให้เอเจนต์

งานของเอเจนต์บางอย่างไม่จำเป็นต้องทำงานอย่างต่อเนื่องหรือทำงานตามคำขอ แต่งานเหล่านั้นทำงานตามตารางเวลา รายงานประจำวัน สรุปประจำสัปดาห์ การตรวจสอบข้อมูลรายชั่วโมง และการล้างข้อมูลเป็นระยะ ล้วนเหมาะสำหรับเอเจนต์ที่ทำงานตามตารางเวลา

พื้นฐาน APScheduler

APScheduler (ตัวจัดตารางเวลา Python ขั้นสูง) เรียกใช้งานต่าง ๆ ภายในกระบวนการ Python ของคุณ และรองรับตัวกระตุ้นสามประเภท ได้แก่ date (ครั้งเดียว) interval (ทำซ้ำ) และ cron (อิงตามปฏิทิน)

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background import BackgroundScheduler
from datetime import datetime

# BlockingScheduler: takes over the main thread
# BackgroundScheduler: runs in background thread

scheduler = BackgroundScheduler()

def my_agent_job():
    print(f'Agent running at {datetime.now()}')

# Add a simple interval job
scheduler.add_job(my_agent_job, 'interval', minutes=5)

scheduler.start()
print('Scheduler started in background')

# Your app continues running here
import time
time.sleep(15)
scheduler.shutdown()
print('Scheduler stopped')

ไวยากรณ์ตัวกระตุ้น Cron

ตัวกระตุ้น cron ใช้ฟิลด์ cron ที่คุ้นเคย ได้แก่ year, month, day, week, day_of_week, hour, minute, second คุณสามารถใช้ตัวเลข ช่วง รายการ และไวลด์การ์ดได้

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()

def morning_briefing():
    print('Good morning! Running daily briefing agent')

def weekly_report():
    print('Running weekly summary')

def every_business_hour():
    print('Hourly check during business hours')

# Every day at 9:00 AM
scheduler.add_job(morning_briefing, 'cron', hour=9, minute=0)

# Every Monday at 8:30 AM
scheduler.add_job(weekly_report, 'cron', day_of_week='mon', hour=8, minute=30)

# Every hour from 9am to 5pm, weekdays only
scheduler.add_job(every_business_hour, 'cron',
    day_of_week='mon-fri',
    hour='9-17',
    minute=0
)

scheduler.start()
print('Jobs scheduled:', len(scheduler.get_jobs()))

ไวยากรณ์นิพจน์ Cron

นิพจน์ cron มาตรฐานใช้ 5 ฟิลด์ ได้แก่ minute hour day month weekday APScheduler ยังรับค่าเหล่านี้เป็นสตริงเดียวด้วย CronTrigger.from_crontab()

  • 0 9 * * * — 9 นาฬิกาทุกวัน
  • 0 9 * * 1 — 9 นาฬิกาทุกวันจันทร์
  • */15 * * * * — ทุก 15 นาที
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger

scheduler = BackgroundScheduler()

def agent_task():
    print('Running scheduled agent')

# From crontab string: every day at 9am
trigger = CronTrigger.from_crontab('0 9 * * *')
scheduler.add_job(agent_task, trigger)

# Equivalent explicit form
scheduler.add_job(
    agent_task,
    'cron',
    minute=0,
    hour=9
)

# Every 15 minutes
scheduler.add_job(agent_task, CronTrigger.from_crontab('*/15 * * * *'))

print('Scheduled jobs:')
for job in scheduler.get_jobs():
    print(f'  {job.id}: next run {job.next_run_time}')

ตัวกระตุ้นตามช่วงเวลา

ตัวกระตุ้นตามช่วงเวลาจะเรียกใช้งานทุก ๆ N หน่วยเวลา ใช้สำหรับการตรวจสอบเป็นระยะ สัญญาณชีพ หรือ งานใด ๆ ที่ควรทำซ้ำด้วยความถี่คงที่

from apscheduler.schedulers.background import BackgroundScheduler
from datetime import datetime, timedelta

scheduler = BackgroundScheduler()

def check_for_updates():
    print(f'Checking for updates at {datetime.now()}')
    # Agent logic: poll API, check for new items

# Every 30 minutes
scheduler.add_job(check_for_updates, 'interval', minutes=30)

# Every 2 hours, starting 10 minutes from now
start_time = datetime.now() + timedelta(minutes=10)
scheduler.add_job(
    check_for_updates,
    'interval',
    hours=2,
    start_date=start_time
)

# Run once in the future (date trigger)
from apscheduler.triggers.date import DateTrigger
run_at = datetime.now() + timedelta(minutes=5)
scheduler.add_job(check_for_updates, DateTrigger(run_date=run_at))

scheduler.start()
print('All jobs scheduled')

พารามิเตอร์และ ID ของงาน

กำหนด ID ให้กับงานเพื่อให้สามารถอ้างอิง หยุดชั่วคราว หรือนำงานออกได้ในภายหลัง ส่งอาร์กิวเมนต์ไปยังฟังก์ชันงานผ่าน args หรือ kwargs

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()

def fetch_report(report_type, user_id):
    print(f'Fetching {report_type} report for user {user_id}')

# Named job with arguments
scheduler.add_job(
    fetch_report,
    'cron',
    hour=9,
    minute=0,
    id='daily_report_user_42',
    kwargs={'report_type': 'daily', 'user_id': 42},
    replace_existing=True  # Update if job already exists
)

scheduler.start()

# Pause a specific job
scheduler.pause_job('daily_report_user_42')
print('Job paused')

# Resume it
scheduler.resume_job('daily_report_user_42')
print('Job resumed')

# Remove it
scheduler.remove_job('daily_report_user_42')
print('Job removed')

การคงงานไว้หลังการเริ่มระบบใหม่

โดยค่าเริ่มต้น APScheduler จะจัดเก็บงานไว้ในหน่วยความจำ และงานเหล่านั้นจะสูญหายเมื่อเริ่มระบบใหม่ ใช้ ที่เก็บงาน SQLAlchemy เพื่อคงงานไว้ในฐานข้อมูล ทำให้งานยังอยู่หลังการเริ่มระบบใหม่

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.executors.pool import ThreadPoolExecutor

jobstores = {
    'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}

executors = {
    'default': ThreadPoolExecutor(20)
}

scheduler = BackgroundScheduler(
    jobstores=jobstores,
    executors=executors
)

def persistent_agent():
    print('Running persisted scheduled agent')

# This job survives restarts
scheduler.add_job(
    persistent_agent,
    'cron',
    hour=8,
    minute=0,
    id='morning_agent',
    replace_existing=True
)

scheduler.start()
print('Scheduler started with SQLite persistence')

การจัดการข้อยกเว้นของงาน

ครอบฟังก์ชันงานตามตารางเวลาด้วย try/except เพื่อป้องกันไม่ให้การทำงานที่ล้มเหลวครั้งหนึ่งหยุดการทำงานครั้งต่อ ๆ ไปโดยไม่มีการแจ้งเตือน บันทึกความล้มเหลวและส่งการแจ้งเตือนได้ตามต้องการ

import logging
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('scheduler')

scheduler = BackgroundScheduler()

def job_listener(event):
    if event.exception:
        logger.error(f'Job {event.job_id} failed: {event.exception}')
        # Optionally send alert: email, Slack, PagerDuty
    else:
        logger.info(f'Job {event.job_id} completed successfully')

scheduler.add_listener(job_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)

def my_agent_job():
    # Errors here are caught by the listener
    raise ValueError('Something went wrong in the agent')

scheduler.add_job(my_agent_job, 'interval', seconds=10, id='test_job')
scheduler.start()

การป้องกันงานทำงานซ้อนกัน

หากงานใช้เวลานานกว่าช่วงเวลาที่กำหนด การทำงานครั้งถัดไปอาจเริ่มก่อนที่ครั้งก่อนหน้าจะเสร็จสิ้น กำหนด max_instances=1 (ค่าเริ่มต้น) หรือใช้การรวมงานเพื่อข้ามการทำงานที่พลาดไป

from apscheduler.schedulers.background import BackgroundScheduler
import time

scheduler = BackgroundScheduler()

def slow_agent():
    print('Agent started')
    time.sleep(45)  # Takes 45 seconds
    print('Agent finished')

# max_instances=1: only one run at a time (default)
# coalesce=True: if multiple runs were missed, fire only once when caught up
scheduler.add_job(
    slow_agent,
    'interval',
    minutes=1,
    max_instances=1,
    coalesce=True,
    id='slow_agent'
)

scheduler.start()
print('Slow agent scheduled (max 1 concurrent run)')

การผสานการจัดตารางเวลากับ FastAPI

ใช้ BackgroundScheduler ของ APScheduler ภายใน FastAPI ร่วมกับบริบทอายุการทำงาน เพื่อเริ่มและหยุดตัวจัดตารางเวลาอย่างเรียบร้อยตามวงจรการทำงานของเซิร์ฟเวอร์

from fastapi import FastAPI
from apscheduler.schedulers.background import BackgroundScheduler
from contextlib import asynccontextmanager

scheduler = BackgroundScheduler()

def morning_agent_job():
    print('Morning agent running')

@asynccontextmanager
async def lifespan(app: FastAPI):
    # Start scheduler when app starts
    scheduler.add_job(morning_agent_job, 'cron', hour=9, minute=0)
    scheduler.start()
    print('Scheduler started')
    
    yield  # App runs here
    
    # Stop scheduler when app shuts down
    scheduler.shutdown()
    print('Scheduler stopped')

app = FastAPI(lifespan=lifespan)

@app.get('/jobs')
def list_jobs():
    return [
        {'id': job.id, 'next_run': str(job.next_run_time)}
        for job in scheduler.get_jobs()
    ]

การจัดตารางเวลาที่คำนึงถึงเขตเวลา

ระบุเขตเวลาสำหรับเอเจนต์ที่ทำงานตามตารางเวลาเสมอ งาน cron ที่ไม่มีบริบทเขตเวลาอาจทำงานผิดเวลาเมื่อมีการเปลี่ยนเวลาออมแสง

from apscheduler.schedulers.background import BackgroundScheduler
import pytz

# Scheduler with timezone
scheduler = BackgroundScheduler(timezone='America/New_York')

def ny_morning_agent():
    print('Running at 9am New York time')

def london_eod_agent():
    print('Running at 5pm London time')

# 9am New York (handles EST/EDT automatically)
scheduler.add_job(
    ny_morning_agent,
    'cron',
    hour=9,
    minute=0,
    timezone=pytz.timezone('America/New_York')
)

# 5pm London time
scheduler.add_job(
    london_eod_agent,
    'cron',
    hour=17,
    minute=0,
    timezone=pytz.timezone('Europe/London')
)

scheduler.start()
print('Timezone-aware scheduler running')

ตรวจสอบความรู้: การจัดตารางเวลา

ทดสอบความเข้าใจเกี่ยวกับ APScheduler และเอเจนต์ที่ทำงานตาม cron

แนวทางปฏิบัติที่ดีที่สุดสำหรับการจัดตารางเวลา

กฎสำคัญสำหรับเอเจนต์ที่ทำงานตามตารางเวลาอย่างน่าเชื่อถือ:

  • ใช้การจัดตารางเวลาที่คำนึงถึงเขตเวลาเสมอ
  • คงงานไว้ในฐานข้อมูลเพื่อให้อยู่ต่อหลังการเริ่มระบบใหม่
  • กำหนด max_instances=1 สำหรับงานที่ทำงานเป็นเวลานาน
  • เพิ่มตัวฟังข้อผิดพลาดเพื่อดักจับความล้มเหลวที่ไม่แสดงออก
  • บันทึกการทำงานตามตารางเวลาทุกรอบ พร้อมเวลาเริ่ม เวลาเสร็จสิ้น และผลลัพธ์

คำถามที่พบบ่อย

บทเรียน “ตัวแทนตามกำหนดเวลาและ Cron” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวแทนตามกำหนดเวลาและ Cron” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวแทนตามกำหนดเวลาและ Cron”

APScheduler งาน cron และการเรียกใช้ตัวแทนอัตโนมัติตามเวลา คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวแทนตามกำหนดเวลาและ Cron” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. รูปแบบตัวแทนทริกเกอร์-การดำเนินการ
  2. การเชื่อมต่อตัวแทนกับเว็บฮุก
  3. ตัวแทนตามกำหนดเวลาและ Cron
  4. การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป
← กลับไปที่ AI Agents