Loading...
Loading...
Compare original and translation side by side
erpnext-syntax-schedulererpnext-syntax-scheduler┌─────────────────────────────────────────────────────────────────────┐
│ SCHEDULER DECISION │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Run at fixed intervals or times? │
│ ├── YES → Scheduler Event (hooks.py) │
│ │ See: references/workflows.md §1-2 │
│ │ │
│ └── NO → Run in response to user action? │
│ ├── YES → frappe.enqueue() │
│ │ See: references/workflows.md §3-4 │
│ │ │
│ └── NO → Probably neither - reconsider requirements │
│ │
└─────────────────────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────────────────────┐
│ 调度器决策树 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 是否需要按固定间隔或时间运行? │
│ ├── 是 → 调度器事件(hooks.py) │
│ │ 参考:references/workflows.md §1-2 │
│ │ │
│ └── 否 → 是否需响应用户操作触发? │
│ ├── 是 → frappe.enqueue() │
│ │ 参考:references/workflows.md §3-4 │
│ │ │
│ └── 否 → 不属于上述场景 - 请重新审视需求 │
│ │
└─────────────────────────────────────────────────────────────────────┘| Aspect | Scheduler Event | frappe.enqueue |
|---|---|---|
| Triggered by | Time/interval | Code execution |
| Defined in | hooks.py | Python code |
| Arguments | None (must be parameterless) | Any serializable data |
| Use case | Daily cleanup, hourly sync | User-triggered long task |
| Restart behavior | Runs on schedule | Lost if worker restarts |
| 维度 | 调度器事件 | frappe.enqueue |
|---|---|---|
| 触发方式 | 时间/间隔 | 代码执行 |
| 定义位置 | hooks.py | Python代码 |
| 参数支持 | 无(必须无参数) | 支持任何可序列化数据 |
| 适用场景 | 每日清理、每小时同步 | 用户触发的长耗时任务 |
| 重启行为 | 按计划自动运行 | 若Worker重启则任务丢失 |
┌─────────────────────────────────────────────────────────────────────┐
│ SCHEDULER EVENT TYPE │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Simple recurring interval? │
│ ├── Every minute → scheduler_events.cron["* * * * *"] │
│ ├── Hourly → scheduler_events.hourly │
│ ├── Daily → scheduler_events.daily │
│ ├── Weekly → scheduler_events.weekly │
│ └── Monthly → scheduler_events.monthly │
│ │
│ Complex schedule (e.g., "weekdays at 9am")? │
│ └── scheduler_events.cron["0 9 * * 1-5"] │
│ │
│ Run after every request? │
│ └── scheduler_events.all (use sparingly!) │
│ │
└─────────────────────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────────────────────┐
│ 调度器事件类型选择 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 是否为简单重复间隔? │
│ ├── 每分钟 → scheduler_events.cron["* * * * *"] │
│ ├── 每小时 → scheduler_events.hourly │
│ ├── 每天 → scheduler_events.daily │
│ ├── 每周 → scheduler_events.weekly │
│ └── 每月 → scheduler_events.monthly │
│ │
│ 是否为复杂调度(如"工作日上午9点")? │
│ └── scheduler_events.cron["0 9 * * 1-5"] │
│ │
│ 是否需在每次请求后运行? │
│ └── scheduler_events.all(请谨慎使用!) │
│ │
└─────────────────────────────────────────────────────────────────────┘| Queue | Timeout | Use For |
|---|---|---|
| 5 min | Quick operations (<1 min) |
| 5 min | Standard tasks (1-3 min) |
| 30 min | Heavy processing (>3 min) |
short| 队列 | 超时时间 | 适用场景 |
|---|---|---|
| 5分钟 | 快速操作(耗时<1分钟) |
| 5分钟 | 标准任务(耗时1-3分钟) |
| 30分钟 | 重型处理(耗时>3分钟) |
shortundefinedundefined
```python
```python
After editing hooks.py: `bench migrate`
编辑hooks.py后执行:`bench migrate`undefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedbench migrate # Required to register new scheduler eventsbench migrate # 必须执行此命令以注册新的调度器事件undefinedundefinedundefinedundefinedenqueue(..., job_id="unique_identifier") # Prevents duplicate jobsenqueue(..., job_id="unique_identifier") # 防止重复作业| Aspect | v14 | v15 | v16 |
|---|---|---|---|
| Tick interval | 4 min | 60 sec | 60 sec |
| Job dedup | | | |
| Cron support | ✅ | ✅ | ✅ |
undefined| 维度 | v14 | v15 | v16 |
|---|---|---|---|
| 调度间隔 | 4分钟 | 60秒 | 60秒 |
| 作业去重参数 | | | |
| Cron支持 | ✅ | ✅ | ✅ |
undefined
---
---| File | Contents |
|---|---|
| workflows.md | Step-by-step implementation patterns |
| decision-tree.md | Detailed decision flowcharts |
| examples.md | Complete working examples |
| anti-patterns.md | Common mistakes to avoid |
| 文件 | 内容 |
|---|---|
| workflows.md | 分步实现模式 |
| decision-tree.md | 详细决策流程图 |
| examples.md | 完整可运行示例 |
| anti-patterns.md | 需避免的常见错误 |
erpnext-syntax-schedulererpnext-errors-serverscriptserpnext-syntax-schedulererpnext-errors-serverscripts