gflow 0.4.15

A lightweight, single-node job scheduler written in Rust.
Documentation
# 任务依赖

任务依赖用于构建工作流:一个任务会等待其他任务完成后才开始运行。

## 快速开始

```bash
gbatch --time 10 python preprocess.py
gbatch --depends-on @ --gpus 1 --time 4:00:00 python train.py
gbatch --depends-on @ --time 10 python evaluate.py
```

## 依赖方式

### 单依赖

```bash
gbatch --depends-on <job_id|@|@~N> python next.py
```

语法糖:
- `@`:最近一次提交的任务
- `@~N`:倒数第 N+1 次提交的任务(例如 `@~1` 是上一次提交)

### 多依赖(AND / OR)

```bash
# AND:所有父任务都必须成功完成
gbatch --depends-on-all 101,102,103 python merge.py

# OR:任意一个父任务成功完成即可继续
gbatch --depends-on-any 201,202,203 python process_first_success.py
```

`@` 语法同样可用于列表(例如 `--depends-on-all @,@~1,@~2`)。

### 脚本指令

脚本指令只支持 `--depends-on`(单依赖):

```bash
#!/bin/bash
# GFLOW --depends-on=123

python next.py
```

## 自动取消

默认情况下,当依赖任务失败/取消/超时,依赖它的任务会被自动取消。若希望它们继续保持排队状态,可禁用自动取消:

```bash
gbatch --depends-on <job_id> --no-auto-cancel python next.py
```

禁用后,即使父任务失败,依赖任务也不会自动继续运行;你需要手动取消或重新提交。

## 监控依赖

```bash
# 树视图
gqueue -t
```

示例输出:
```
JOBID  NAME   ST  TIME      NODES  NODELIST(REASON)
1      prep   CD  00:02:15  0      -
├─2    train  R   00:10:03  1      0
└─3    eval   PD  -         0      (WaitingForDependency)
```

```bash
# 只看部分任务
gqueue -j <job_id>,<job_id> -t

# 查看排队原因(通常是等待依赖或资源)
gqueue -s Queued -f JOBID,NAME,ST,NODELIST(REASON)
```

## 故障排除

### 依赖任务未启动

```bash
gqueue -t
gqueue -j <parent_job_id> -f JOBID,ST
ginfo
```

### 修复失败后重做整条链

```bash
gjob redo <job_id> --cascade
```

## 另见

- [任务生命周期]./job-lifecycle - 原因与状态流转
- [时间限制]./time-limits - 防止任务无限运行