Compiled vs Interpreted: 编译型、解释型与脚本语言

背景 教材里常把编程语言分成 编译型(compiled) 和 解释型(interpreted)。二者是一组相对概念,但现代语言大多落在光谱中间,不宜一刀切。 脚本语言(scripting language) 在日常说法里,往往就是解释型一侧的别名,或更窄一点:强调「缩短 edit-compile-link-run、以源码直接跑、做自动化 / 嵌入」的那一类解释型语言。下文先讲编译 / 解释,再单独说脚本。 两种执行路径 类型 典型流程 运行时依赖 编译型 源码 → 编译器 → 机器码 / 本地二进制 → 直接由 OS 加载执行 一般不需要语言自带的解释器;可内嵌 runtime(如 GC) 解释型 源码(或中间表示)由 解释器 边读边执行 必须安装对应解释器 / 运行时 对照: 编译型(AOT): 源码 ──compile──► 本地二进制 ──► 运行 解释型: 源码 ──► 解释器逐句执行 字节码 + VM: 源码 ──compile──► 字节码 ──► 解释 / JIT ──► 机器码 「预编译 / ahead-of-time(AOT)」说的是:运行前就编成可执行形态;日常口语里常与「编译型」混用。注意 C 里的「预编译」有时指 #include / #define 的预处理,那是编译流水线的一步,不是语言分类。 ...

Created 1016-08-01 · Updated 1016-08-01 · 2 min · 395 words · -

Python venv, 虚拟环境与包管理工具(pdm、conda、pipx)

PDM https://pdm-project.org/zh-cn/latest/ https://juejin.cn/post/7315126100539473930 PDM 是一个支持最新 PEP 标准的现代 Python 包和依赖项管理器 PDM(Python Development Master)是一款新一代的 Python 包管理工具,旨在提供更为现代化、可靠且灵活的解决方案。与传统的 pip 和 Poetry 相比,PDM 在依赖版本管理、项目隔离和性能优化等方面展现出独特的优势。 # install pdm sudo apt install python3.10-venv curl -sSL https://pdm-project.org/install-pdm.py | python3 - # 安装程序会将 PDM 安装到用户家目录中, linux 系统 #$HOME/.local/bin Unix 系统 # 初始化项目 pdm sync # 加入新的依赖包, pdm会自动维护 pyproject.toml 文件, 但是版本范围可能需要改一下 pdm add redis # pdm install 和 pdm sync 的区别 # pdm install: 安装 pyproject.toml 中定义的所有依赖,并更新 pdm.lock(如果需要) # pdm sync: 严格按照 pdm.lock 文件安装依赖,不会更新 lock 文件,确保环境完全一致 # 推荐使用场景: # - 开发环境:使用 pdm install,允许依赖更新 # - 生产环境/CI:使用 pdm sync,确保依赖版本完全一致 pdm info --env # pdm use 切换到 Python 3.14 pdm use python3.14 pdm self update rm pdm.lock pdm lock 配置文件 pyproject.toml ...

Created 24246-11-24 · Updated 28286-07-28 · 2 min · 243 words · -

LangGraph - 构建状态化 AI 工作流的框架

什么是 LangGraph LangGraph 是 LangChain 生态系统中的一个框架,专门用于构建有状态的、多步骤的 AI 应用程序。它通过图(Graph)的方式来定义和管理复杂的 AI 工作流,让开发者能够创建具有循环、条件分支和持久化状态的智能体系统。 LangGraph 的核心理念是将 AI 应用程序建模为状态机,其中节点代表操作步骤,边代表流程控制,状态在节点之间传递和更新。 核心概念 State(状态) State 是在整个工作流中传递和更新的数据结构。通常使用 TypedDict 定义: from typing import TypedDict, Annotated from langgraph.graph import add_messages class AgentState(TypedDict): messages: Annotated[list, add_messages] user_input: str analysis_result: str Node(节点) Node 是执行具体操作的函数,接收当前状态并返回更新后的状态: def research_node(state: AgentState): # 执行研究任务 result = do_research(state['user_input']) return { "analysis_result": result, "messages": [("assistant", f"研究完成:{result}")] } Edge(边) Edge 定义节点之间的连接关系: Normal Edge(普通边):直接连接两个节点 Conditional Edge(条件边):根据状态决定下一个节点 from langgraph.graph import StateGraph, END # 普通边 workflow.add_edge("node_a", "node_b") # 条件边 def should_continue(state): if state['done']: return END return "continue_node" workflow.add_conditional_edges( "decision_node", should_continue ) Graph(图) Graph 是完整的工作流定义,包含所有节点、边和状态管理: from langgraph.graph import StateGraph workflow = StateGraph(AgentState) # 添加节点 workflow.add_node("research", research_node) workflow.add_node("analyze", analyze_node) workflow.add_node("respond", respond_node) # 定义边 workflow.add_edge("research", "analyze") workflow.add_edge("analyze", "respond") # 设置入口点 workflow.set_entry_point("research") # 编译图 app = workflow.compile() 核心特性 1. 状态持久化 LangGraph 支持状态的持久化存储,可以实现: ...

Created 18186-01-18 · Updated 26266-07-26 · 5 min · 989 words · -

Python 3.14 新特性探索

Python 3.14 概述 Python 3.14 于 2025 年 10 月 7 日正式发布(当前最新版本:3.14.2,2025年12月5日),带来多项重大改进和新特性。这是 Python 发展历程中的重要里程碑,包括注解系统的重大变革、模板字符串、多解释器支持等令人期待的功能。 核心新特性 PEP 649 & PEP 749: 延迟注解求值 Python 3.14 最重大的变化! 注解不再立即求值,而是存储在特殊的注解函数中,仅在需要时才求值。 关键改进: 大幅提升运行时性能(注解定义成本最小化) 不再需要使用字符串包裹前向引用 新增 annotationlib 模块用于处理注解 三种注解格式: from annotationlib import get_annotations, Format def func(arg: Undefined): pass # VALUE 格式:求值为运行时值 try: get_annotations(func, format=Format.VALUE) except NameError: print("会抛出 NameError") # FORWARDREF 格式:未定义的名称替换为特殊标记 print(get_annotations(func, format=Format.FORWARDREF)) # {'arg': ForwardRef('Undefined', owner=<function func>)} # STRING 格式:以字符串形式返回 print(get_annotations(func, format=Format.STRING)) # {'arg': 'Undefined'} PEP 734: 标准库中的多解释器支持 突破性功能! 在同一进程中运行多个独立 Python 解释器的能力现已暴露给 Python 层。 ...

Created 24246-12-24 · Updated 15156-07-15 · 4 min · 646 words · -

Python 3.12 新特性探索

Python 3.12 新特性概览 Python 3.12 于 2023 年 10 月发布,带来了多项重要改进和新特性。 主要新特性 1. 更灵活的 f-string 解析器 Python 3.12 重写了 f-string 的解析器(PEP 701),解决了之前版本的引号限制问题。 Python 3.11 及之前的限制: f-string 内部不能使用与外部相同的引号类型 如果外部用双引号 f"...",内部只能用单引号 '...' 不支持反斜杠转义 不支持多行表达式 Python 3.12 的改进: # 支持嵌套引号 songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism'] # Python 3.11 及之前版本:语法错误! # print(f"This is the playlist: {", ".join(songs)}") # ❌ 引号冲突 # 必须这样写: # print(f"This is the playlist: {', '.join(songs)}") # ✅ 内部用单引号 # Python 3.12:可以自由嵌套 print(f"This is the playlist: {", ".join(songs)}") # ✅ 支持! # 支持多行表达式和注释 value = f"{ # 计算总和 sum([1, 2, 3]) }" # 支持反斜杠转义 print(f"换行符: {'\n'}") 2. 改进的错误消息 Python 3.12 提供了更详细、更有帮助的错误消息: ...

Created 16166-01-16 · Updated 15156-07-15 · 5 min · 993 words · -

开链法与开放地址法, Separate Chaining and Open Addressing, hashmap

开链法与开放地址法,Separate Chaining and Open Addressing 哈希表在插入元素时,如果两个不同的 key 计算出的哈希值落到了数组的同一个位置,就发生了哈希冲突(hash collision)。解决哈希冲突主要有两种思路:开链法(Separate Chaining)和开放地址法(Open Addressing)。Java 的 HashMap 用的是开链法;Python 的 dict 用的是开放地址法。Java 里也有用开放地址法的例子,比如 IdentityHashMap 和 ThreadLocal.ThreadLocalMap,详见后文「在 Java 中的应用」一节。 开链法,Separate Chaining 开链法是一种二维结构:第一维是一个数组,数组的每个槽位(bucket)挂着一个链表(第二维)。插入元素时,先用 hash 函数算出该 key 应该落在数组的哪个槽位,然后直接把这个 key(连同 value)作为一个节点追加到该槽位的链表上。 当多个不同的 key 计算出相同的槽位时,它们并不会互相覆盖或者被挪到别处,而是全部挂在同一个槽位的链表里,按顺序排列。查找时,先定位到槽位,然后遍历该槽位的链表,逐个比较 key 是否相等,直到找到目标或者遍历到链表末尾。 优点 实现简单,冲突处理直观,槽位之间互不影响。 删除操作非常简单,只需要从链表中把对应节点摘除即可,不会影响其它元素的查找路径。 负载因子(元素个数 / 数组长度)可以大于 1,只是链表会变长,查找退化为线性扫描。 负载因子,Load Factor 负载因子的英文是 load factor,公式为 load factor = 哈希表中总元素个数 / 数组长度(槽位数)。这里的"元素个数"指的是整个哈希表中的元素总数,而不是某一个槽位对应的元素个数;某个槽位挂了多少个元素(链表长度)反映的是 hash 分布是否均匀,是另一个维度的问题。例如数组长度为 16,哈希表中一共存了 12 个元素,此时 load factor 就是 0.75。 开链法下即使 load factor 大于 1(元素个数超过数组长度)也不会出错,只是链表会变长;而开放地址法由于只有一个数组,load factor 不能超过 1(数组会满)。 ...

Created 6066-05-06 · Updated 13136-07-13 · 3 min · 579 words · -

Pandas

简介 pandas 是 Python 中最常用的数据处理库,核心数据结构是 Series(一维)和 DataFrame(二维表格)。常用于读写数据文件、清洗数据、做统计分析。 安装 pip install pandas # 或者用 uv,速度更快 uv pip install pandas 核心数据结构 Series 一维带标签的数组。 import pandas as pd s = pd.Series([1, 2, 3], index=["a", "b", "c"]) print(s["b"]) # 2 DataFrame 二维表格,每列可以是不同的数据类型。 import pandas as pd df = pd.DataFrame({ "name": ["Alice", "Bob", "Carol"], "age": [25, 30, 35], }) print(df) 读写数据 # 读 CSV df = pd.read_csv("data.csv") # 写 CSV df.to_csv("output.csv", index=False) # 读 Excel df = pd.read_excel("data.xlsx") # 读 JSON df = pd.read_json("data.json") 查看数据 df.head() # 前 5 行 df.tail(3) # 后 3 行 df.shape # (行数, 列数) df.columns # 列名 df.dtypes # 每列的数据类型 df.info() # 概览 df.describe() # 数值列的统计摘要 选择数据 df["age"] # 选一列,返回 Series df[["name", "age"]] # 选多列,返回 DataFrame df.loc[0] # 按标签选行 df.iloc[0] # 按位置选行 df[df["age"] > 28] # 条件筛选 常见操作 新增列 df["age_plus_1"] = df["age"] + 1 缺失值处理 df.isna().sum() # 每列缺失值数量 df.dropna() # 删除含缺失值的行 df.fillna(0) # 用 0 填充缺失值 分组聚合 df.groupby("name")["age"].mean() 排序 df.sort_values("age", ascending=False) 合并 # 按列拼接(类似 SQL join) pd.merge(df1, df2, on="id", how="left") # 按行堆叠 pd.concat([df1, df2]) copy() 与 SettingWithCopyWarning 对 DataFrame 做切片或筛选后再赋值,pandas 可能不确定是在原对象上改还是在副本上改,从而报 SettingWithCopyWarning。显式调用 .copy() 可以避免这个问题: ...

Created 9096-07-09 · Updated 9096-07-09 · 1 min · 193 words · -

QuantDinger: 策略与指标模型

QuantDinger 部署在 homelab 的 k8s 环境里,UI 上可以直接完成交易所的挂单和平仓操作。要开发策略并测试自动交易,需要先理清"策略"“指标"“交易引擎"这几个概念之间的关系。 指标(Indicator)是什么 指标很容易被理解成常见的技术指标,比如一条均线。实际上 QuantDinger 里的指标是一段 Python 脚本,同时做两件事: 计算,用来在图表上画线(比如 EMA、RSI); 产出四列交易信号,这才是核心: df['open_long'] # open long signal df['close_long'] # close long signal df['open_short'] # open short signal df['close_short'] # close short signal 策略执行引擎读的就是这四列。止损止盈、仓位比例这些风控参数通过 # @strategy 注解声明,由引擎统一执行,回测和实盘共用一套逻辑。 一个最简单的例子,快慢均线交叉: my_indicator_name = "Agent SMA" my_indicator_description = "SMA crossover" df = df.copy() fast = close.rolling(10).mean() slow = close.rolling(30).mean() cross_up = (fast > slow) & (fast.shift(1) <= slow.shift(1)) cross_dn = (fast < slow) & (fast.shift(1) >= slow.shift(1)) df['open_long'] = cross_up.fillna(False).astype(bool) df['close_long'] = cross_dn.fillna(False).astype(bool) df['open_short'] = False df['close_short'] = False output = {'name': my_indicator_name, 'plots': [], 'signals': []} 指标脚本本身是无状态的:每次被调用时拿到一批 K 线数据(df),一次性向量化算出所有信号,不记得上一次调用发生了什么,也不会自己去拉数据或者下单。 df 里的 OHLCV 是什么 df 这个变量是引擎注入进来的 K 线(OHLCV)数据,一个 pandas DataFrame,至少包含这五列: Open:开盘价,这根 K 线周期开始时的成交价 High:最高价,这根 K 线周期内出现过的最高成交价 Low:最低价,这根 K 线周期内出现过的最低成交价 Close:收盘价,这根 K 线周期结束时的成交价 Volume:成交量,这根 K 线周期内一共成交了多少数量的标的 每一行对应一根 K 线(一个 bar),按时间顺序排列,具体周期由策略的 timeframe 决定(比如 1 小时线就是每行一根 1 小时 K 线)。OHLCV 不是量化领域独有的发明,而是股票、期货这类传统市场里画 K 线图、做技术分析时就在用的行业标准术语,交易所 API、数据供应商返回的历史行情都是这五个字段,量化系统只是直接沿用了这套已有的数据契约。 ...

Created 8086-07-08 · Updated 9096-07-09 · 2 min · 416 words · -

工作流引擎

什么是工作流引擎 工作流引擎(Workflow Engine / Process Engine)是一种用于定义、执行和管理业务流程的中间件。它把业务逻辑从代码中剥离出来,用流程图(或规则配置)来描述"下一步该做什么、由谁来做、满足什么条件才能流转",从而让业务流程可配置、可追踪、可审计。 典型应用场景: 审批流:请假、报销、合同会签 订单流转:下单 → 支付 → 发货 → 收货 → 售后 任务编排:复杂的多步骤业务处理链路 规则驱动的路由决策 主流引擎一览 工作流引擎大致分两类: BPMN 流程引擎:遵循 BPMN 2.0 标准,配套可视化设计器,偏重人工审批、流程管理 轻量规则流引擎:不依赖 BPMN,以组件编排为核心,更适合纯代码驱动的业务链路 jBPM 官网:https://jbpm.org 仓库:https://github.com/kiegroup/jbpm jBPM 是 Java 工作流引擎的"鼻祖",由 Red Hat(JBoss)维护,历史最悠久。 特点: 与 Drools(规则引擎)深度集成,适合流程 + 规则组合的场景 提供 KIE Workbench 可视化管理平台 技术栈较重,学习曲线陡峭 社区活跃度不如 Flowable,国内使用较少 适用场景: 已有 Red Hat/JBoss 技术栈,或需要流程与 Drools 规则引擎联动。 Activiti 官网:https://www.activiti.org 仓库:https://github.com/Activiti/Activiti Activiti 是国内使用最广泛的开源 BPMN 流程引擎,诞生于 2010 年,由 Alfresco 公司主导,核心开发者来自 jBPM。 ...

Created 16166-06-16 · Updated 16166-06-16 · 5 min · 900 words · -

FastAPI 与 Flask 对比

概述 Flask 和 FastAPI 都是 Python 生态里常用的 Web 框架,适合写 REST API 和小型后端服务。Flask 出现更早、生态成熟;FastAPI 更年轻,主打类型注解、自动文档和高性能。两者都不是「全栈 MVC 框架」(那是 Django 的领域),选型时往往是在「轻量 API 框架」之间做取舍。 核心对比 维度 Flask FastAPI 首发年份 2010 2018 维护方 Pallets Sebastián Ramírez 及社区 核心定位 微框架,灵活可扩展 现代 API 框架,开箱即用 路由与视图 装饰器 @app.route 装饰器 @app.get 等,按 HTTP 方法拆分 请求/响应校验 需自行集成(如 Marshmallow、Pydantic) 内置 Pydantic,类型即契约 OpenAPI / Swagger 需扩展(flask-smorest、apispec 等) 内置,访问 /docs、/redoc 异步支持 2.0+ 支持 async def,但生态仍以同步为主 原生 async,基于 ASGI 默认服务器 Werkzeug(开发),生产常用 Gunicorn + WSGI Uvicorn / Hypercorn(ASGI) 性能(粗略) 中等,够用 通常更高(尤其 I/O 密集、高并发) 学习曲线 平缓,文档与示例极多 需熟悉类型注解和 Pydantic 生态与插件 非常丰富(登录、ORM、Admin 等) 增长快,常与 SQLAlchemy、SQLModel 搭配 Flask 简介 Flask 是「微框架」:只提供路由、请求上下文、模板(Jinja2)等核心能力,数据库、认证、序列化都靠扩展拼装。这种设计让项目可以极简起步,也适合已有架构的团队按需引入组件。 ...

Created 21216-05-21 · Updated 21216-05-21 · 2 min · 323 words · -

EAFP vs LBYL

两种处理错误/边界条件的编程风格,在 Python 社区尤为常见。 LBYL — Look Before You Leap(先检查再操作) 谚语来源: “Look Before You Leap” 字面意思是"跳跃之前,先看清脚下"。想象要跳过一条沟——不先看清落脚点就跳,可能会摔进坑里。引申为行动之前先确认条件是否安全,对应中文谚语"三思而后行"、“谋定而后动”。 在编程里,“leap”(跳跃)= 执行操作,“look”(看)= if 条件检查。 操作前先检查前提条件是否满足。 # LBYL 风格 if key in my_dict: value = my_dict[key] else: value = default if os.path.exists(filepath): with open(filepath) as f: data = f.read() 特点: 逻辑清晰,防御性强 存在 TOCTOU(Time-Of-Check-Time-Of-Use)竞态条件风险——检查和使用之间状态可能改变 代码中充满 if 判断,容易冗长 EAFP — Easier to Ask Forgiveness than Permission(先操作再处理异常) 短语来源: 这句话来自生活场景的比喻——想做某事时,与其事先去请示许可(可能被拒绝、很麻烦),不如直接去做,事后出了问题再道歉求谅解,因为道歉往往比请示更容易。 英文 字面意思 编程含义 Ask Permission 事先请求许可 用 if 检查条件是否满足 Ask Forgiveness 事后请求原谅 用 except 处理出错的异常 这个说法由 Python 之父 Guido van Rossum 推广,体现了 Python 的哲学:代码应该表达意图,而不是充满防御性检查。 ...

Created 23236-03-23 · Updated 23236-03-23 · 1 min · 161 words · -

CrewAI - 多智能体协作框架

什么是 CrewAI CrewAI 是一个开源的 Python 框架,专门用于构建和管理多智能体(Multi-Agent)系统。它允许开发者创建一个由多个 AI 智能体组成的"团队"(Crew),这些智能体可以协同工作,共同完成复杂的任务。 核心概念 Agent(智能体) Agent 是 CrewAI 中的基本执行单元,代表一个具有特定角色和能力的 AI 助手。每个 Agent 具有: Role(角色):定义 Agent 的身份和职责 Goal(目标):Agent 要达成的目标 Backstory(背景故事):为 Agent 提供上下文和个性 Tools(工具):Agent 可以使用的工具集合 from crewai import Agent researcher = Agent( role='研究员', goal='收集和分析相关信息', backstory='你是一位经验丰富的研究专家,擅长从各种来源收集准确信息', tools=[search_tool, scrape_tool], verbose=True ) Task(任务) Task 定义了需要完成的具体工作,包括: Description(描述):任务的详细说明 Agent:负责执行该任务的智能体 Expected Output(期望输出):任务完成后的预期结果 from crewai import Task research_task = Task( description='研究 AI 领域的最新发展趋势', agent=researcher, expected_output='一份包含最新 AI 趋势的详细报告' ) Crew(团队) Crew 是多个 Agent 和 Task 的组合,负责协调整个工作流程: from crewai import Crew, Process crew = Crew( agents=[researcher, writer, reviewer], tasks=[research_task, write_task, review_task], process=Process.sequential # 顺序执行 ) result = crew.kickoff() 执行流程 CrewAI 支持两种执行流程: ...

Created 18186-01-18 · Updated 18186-01-18 · 3 min · 524 words · -

python timed task, 定时任务

python timed task, 定时任务 while True sleep Timeloop threading.Timer sched schedule APScheduler Celery Apache Airflow while True: + sleep() 主要缺点: 只能设定间隔,不能指定具体的时间,比如每天早上8:00 sleep 是一个阻塞函数,也就是说 sleep 这一段时间,程序什么也不能操作。 Timeloop库 Timeloop是一个库,可用于运行多周期任务。这是一个简单的库,它使用decorator模式在线程中运行标记函数。 threading.Timer threading 模块中的 Timer 是一个非阻塞函数,比 sleep 稍好一点,timer最基本理解就是定时器,我们可以启动多个定时任务,这些定时器任务是异步执行,所以不存在等待顺序执行问题。 内置模块sched sched模块实现了一个通用事件调度器,在调度器类使用一个延迟函数等待特定的时间,执行任务。同时支持多线程应用程序,在每个任务执行后会立刻调用延时函数,以确保其他线程也能执行。 比threading.Timer更好,不需要循环调用。 调度模块schedule schedule是一个第三方轻量级的任务调度模块,可以按照秒,分,小时,日期或者自定义事件执行时间。schedule允许用户使用简单、人性化的语法以预定的时间间隔定期运行Python函数(或其它可调用函数)。 任务框架 APScheduler APScheduler(advanceded python scheduler)基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务。基于这些功能,我们可以很方便的实现一个Python定时任务系统。 它有以下三个特点: 类似于 Liunx Cron 的调度程序(可选的开始/结束时间) 基于时间间隔的执行调度(周期性调度,可选的开始/结束时间) 一次性执行任务(在设定的日期/时间运行一次任务) APScheduler有四种组成部分: 触发器(trigger) 包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行。除了他们自己初始配置意外,触发器完全是无状态的。 作业存储(job store) 存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储是将作业保存在数据库中。一个作业的数据讲在保存在持久化作业存储时被序列化,并在加载时被反序列化。调度器不能分享同一个作业存储。 执行器(executor) 处理作业的运行,他们通常通过在作业中提交制定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。 调度器(scheduler) 是其他的组成部分。你通常在应用只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。通过配置executor、jobstore、trigger,使用线程池(ThreadPoolExecutor默认值20)或进程池(ProcessPoolExecutor 默认值5)并且默认最多3个(max_instances)任务实例同时运行,实现对job的增删改查等调度控制 分布式消息系统Celery Celery是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具, 也可用于任务调度。Celery 的配置比较麻烦,如果你只是需要一个轻量级的调度工具,Celery 不会是一个好选择。 数据流工具 Apache Airflow Apache Airflow 是Airbnb开源的一款数据流程工具,目前是Apache孵化项目。以非常灵活的方式来支持数据的ETL过程,同时还支持非常多的插件来完成诸如HDFS监控、邮件通知等功能。Airflow支持单机和分布式两种模式,支持Master-Slave模式,支持Mesos等资源调度,有非常好的扩展性。被大量公司采用。 ...

Created 23236-10-23 · Updated 23236-10-23 · 1 min · 78 words · -