botflow
Python 数据流编程框架,用 Pipe/Route 串联数据处理节点,支持 asyncio 并发
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Python 数据流编程框架,用 Pipe/Route 串联数据处理节点,支持 asyncio 并发
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下,你是一名量化交易员,需要实时监控多个交易所的比特币价格差异,寻找套利机会。你的程序需要:每 2 秒自动抓取数据 → 解析 JSON → 计算价差 → 打印结果或触发交易。传统做法是写一个死循环 + 调度器 + HTTP 客户端 + 解析器,代码耦合严重,扩展困难。
Botflow 正是为这类场景设计的:它让你用几行代码,像搭积木一样把数据处理步骤串联起来,数据自动在各个环节之间流动,你只需关注「数据怎么流动」,而不是「循环怎么写」。

数据流编程(Dataflow Programming)是一种范式:所有函数通过管道(Pipe)连接,函数之间通过数据队列通信。当数据流入时,函数被自动调用并产生结果,传给下一个函数。
这与 Unix 的管道操作如出一辙:ls | grep python | sort。Botflow 将这个思想带入了 Python 世界,并支持异步并发执行。
核心优势:
Botflow 起源于作者 Guojian Li 的个人项目,原名 Databot,后更名为 Botflow(2020 年前后)。项目基于 Python 3.6+,核心依赖包括:
它与 Celery 有相似的设计哲学(任务队列 + worker),但更专注于数据管道的声明式构建,而非通用的任务调度。
Botflow 有两个核心抽象:Pipe(管道) 和 Route(路由)。
Pipe 是线性数据处理链,数据从一端流入,依次经过每个处理节点:
from botflow import *
Pipe(
Timer(delay=2), # 每 2 秒触发
"https://api.coindesk.com/v1/bpi/currentprice.json", # URL
HttpLoader(), # 加载 HTTP 响应
lambda r: r.json['bpi']['USD']['rate_float'], # 解析 JSON
print, # 输出
).render('output').run()
或者链式风格:
p = (Pipe()
.Timer(delay=2)
.Loop("https://api.coindesk.com/v1/bpi/currentprice.json")
.Http
.Json()
.Print())
p.run()
Route 负责数据的条件路由、分支合并、并行处理:
这些组件可以自由组合,构建出复杂的数据处理网络。
Botflow 覆盖了数据管道的三大经典场景:
内置 HttpLoader、HttpRequest,配合 BeautifulSoup/lxml,可快速构建异步爬虫:
Pipe(
"https://news.example.com",
HttpLoader(),
lambda r: BeautifulSoup(r.text, 'lxml'),
lambda soup: [a.text for a in soup.select('h2.title')],
save_to_database,
).run()
示例中包含百度新闻爬虫、亚马逊书籍爬虫、拉勾职位爬虫等完整案例。
在模型训练/推理链路中,Botflow 可以连接数据预处理 → 特征工程 → 模型推理 → 结果输出各个环节,且支持 GPU 加速(通过 boost_type 标志)。
内置比特币价格聚合、加密货币价差套利等示例,展示如何将实时行情数据流接入交易逻辑。
HttpServer、HttpLoader、HttpResponse 等组件使 Botflow 同时具备构建 HTTP API 的能力,可作为轻量级 Web 服务使用。
Botflow 的架构围绕异步事件循环展开:
整体采用**有向无环图(DAG)**结构,通过 graphviz 可视化展示数据流向。
pip install -U botflow
# macOS/Linux
brew install graphviz
# Ubuntu
sudo apt install graphviz
但需要注意几点门槛:
Botflow 并非完美,在选型时需要权衡:
tests/ 目录存在但覆盖率有限,生产使用有风险尽管 Botflow 相对小众,但它代表了一类面向数据工程师的数据流编程框架的探索方向。在 Prefect、Airflow 主导的 workflow orchestration 市场之外,Botflow 提供了一种更轻量、更 Pythonic 的选择——不需要写 YAML 配置,直接用 Python 代码声明数据流。
对于需要快速构建数据采集管道、实验性 ML 流水线的个人开发者或小团队,Botflow 仍有一定价值。但生产级项目建议选择更成熟、生态更完善的方案。
.render() 可视化你的第一个管道lambda 为命名函数,降低调试难度