TaskQ 是一个运行于 Linux 主机上的轻量级任务调度系统,用于管理本地计算任务。
目标是提供类似 Slurm、Jenkins Worker、Celery Worker 的核心能力,但保持:
- 单机部署
- 低资源占用
- 简单可靠
- 易扩展
用户通过 CLI 提交任务,由后台 daemon 负责:
- 接收任务
- 持久化任务状态
- 调度执行
- 管理并发
- 收集日志
- 控制任务生命周期
支持:
- 多队列管理
- 任务提交
- 任务状态查询
- 任务取消
- 日志查看
- 并发限制
- 任务持久化
- daemon 开机启动
示例:
taskq run gpu python train.py
taskq ps
taskq logs 1001
taskq stop 1001第一阶段不考虑:
- 多机器调度
- 分布式一致性
- 容器编排
- 网络 worker 集群
这些能力可以在后续版本扩展。
+-------------+
| taskq CLI |
+-------------+
|
|
Unix Domain Socket
|
v
+-------------+
| taskqd |
| daemon |
+-------------+
+-----------+-----------+
| | |
v v v
Scheduler Storage Executor
| | |
| | |
v v v
Queue SQLite Child Process
Rust
原因:
- 内存安全
- 并发安全
- 系统级能力
- 适合长期运行 daemon
| 功能 | 技术 |
|---|---|
| 异步运行时 | Tokio |
| CLI | Clap |
| 数据库 | SQLite |
| ORM/DB | SQLx 或 rusqlite |
| 序列化 | Serde |
| 日志 | tracing |
| IPC | Unix Domain Socket |
taskq/
├── crates/
│
├── taskq-cli/
│ └── main.rs
│
├── taskqd/
│ └── main.rs
│
├── scheduler/
│ └── scheduler.rs
│
├── executor/
│ └── executor.rs
│
├── storage/
│ └── sqlite.rs
│
├── protocol/
│ └── message.rs
│
├── common/
│ └── types.rs
│
├── config/
│
└── systemd/
taskq/
├── cmd/
│
│ ├── taskq/
│ │ └── main.go
│ │
│ └── taskqd/
│ └── main.go
│
├── internal/
│
│ ├── daemon/
│ │ └── server.go
│ │
│ ├── scheduler/
│ │ └── scheduler.go
│ │
│ ├── queue/
│ │ └── queue.go
│ │
│ ├── job/
│ │ └── job.go
│ │
│ ├── executor/
│ │ └── executor.go
│ │
│ ├── storage/
│ │ └── sqlite.go
│ │
│ └── protocol/
│ └── message.go
│
├── go.mod
└── README.md
struct Job {
id: i64,
queue: String,
command: String,
args: Vec<String>,
status: JobStatus,
pid: Option<u32>,
created_at: DateTime,
started_at: Option<DateTime>,
finished_at: Option<DateTime>,
}状态:
enum JobStatus {
Pending,
Running,
Completed,
Failed,
Cancelled,
}struct Queue {
name: String,
max_workers: usize,
pending_jobs: Vec<JobId>,
running_jobs: Vec<JobId>,
}示例:
gpu:
max_workers = 1
running:
1001
pending:
1002
1003
build:
max_workers = 4
running:
2001
2002
采用 SQLite 作为持久化层。
CREATE TABLE jobs (
id INTEGER PRIMARY KEY,
queue TEXT NOT NULL,
command TEXT NOT NULL,
status TEXT NOT NULL,
pid INTEGER,
created_at INTEGER,
started_at INTEGER,
finished_at INTEGER
);CREATE TABLE queues (
name TEXT PRIMARY KEY,
max_workers INTEGER
);CREATE TABLE logs (
job_id INTEGER,
stdout_path TEXT,
stderr_path TEXT
);命令:
taskq run gpu python train.py流程:
CLI
|
|
Unix Socket
|
|
taskqd
|
|
create Job
|
|
insert SQLite
|
|
scheduler dispatch
taskq ps输出:
ID QUEUE STATUS
1001 gpu RUNNING
1002 gpu PENDING
taskq stop 1001daemon:
lookup job
|
find pid
|
SIGTERM
|
update status
Scheduler 负责:
- 检查队列
- 分配 worker slot
- 启动任务
核心逻辑:
loop:
load queues
for queue:
while available_slot:
job = next_pending()
executor.start(job)
sleep(interval)
Executor 负责:
- 创建进程
- 管理 stdout/stderr
- 监听退出
Rust:
Command::new(program)
.args(args)
.spawn();任务结构:
taskqd
|
+--- job 1001
|
+--- job 1002
Pending
|
scheduler dispatch
|
Running
Running
|
child exit
|
SIGCHLD/event
|
Completed
通信方式:
Unix Domain Socket
/run/taskq/taskqd.sock
消息:
enum Request {
Submit(JobRequest),
List,
Status(JobId),
Cancel(JobId),
}响应:
enum Response {
Success,
Error(String),
Jobs(Vec<Job>),
}路径:
/etc/taskq/config.toml
示例:
[data]
path="/var/lib/taskq"
[queue.gpu]
workers=1
[queue.build]
workers=4
目录:
/var/log/taskq/
1001.stdout
1001.stderr
日志系统:
- tracing
- log rotation
限制:
- 用户只能管理自己的任务
- queue 权限控制
- 工作目录隔离
未来支持:
- namespace
- cgroup
- container executor
服务:
/etc/systemd/system/taskqd.service
启动:
systemctl enable taskqd
systemctl start taskqd实现:
- daemon
- CLI
- Unix socket
- fork/exec
- 状态查询
目标:
taskq run test echo hello增加:
- 多 queue
- worker limit
- SQLite
- cancel
增加:
- 日志系统
- 权限控制
- systemd
- 配置管理
增加:
- priority
- retry
- dependency
- GPU binding
- container executor
最终目标:
TaskQ
|
+-- Local Scheduler
|
+-- GPU Scheduler
|
+-- Container Runtime
|
+-- Web Dashboard
|
+-- Distributed Worker
TaskQ 可以逐步演进为一个轻量级计算任务平台。