ตัวแทนตามกำหนดเวลาและ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบตัวแทนทริกเกอร์-การดำเนินการ
- การเชื่อมต่อตัวแทนกับเว็บฮุก
- ตัวแทนตามกำหนดเวลาและ Cron
- การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป