13 funweb (funboost web manager) 介绍
术语说明:funweb 是 funboost_web_manager 的简称。
通过 funweb 可以查看消费结果;管理队列;管理消费者;查看正在运行的函数; 实时调节并发数量;调节 qps 限制频率;仅从页面就能看到python 函数的消费情况,无需去查看日志文件。
说明:funweb 不一定需要用户安装mongo,用户只要不使用前2个页面就好了,后几个页面都是依赖redis,不依赖mongo.
13.1 介绍 启动 funweb (funboost web manager) (方式一)。
funweb 启动方式很容易很简单,一键就能启动。
python3 -m funboost.funweb.app
web代码在funboost安装包里面,所以你安装了funboost后,可以直接使用命令行运行起来,不需要用户现亲自下载web代码就可以直接一键启动运行。
首先要安装选装 pip install funboost[flask]
(这是因为这是选装,防止用户抱怨funboost依赖太多。)第一步:设置 PYTHONPATH 为你的项目根目录
export PYTHONPATH=你的项目根目录 (这么做是为了这个web可以读取到你项目根目录下的 funboost_config.py里面的配置)
(怎么设置环境变量应该不需要我来教,环境变量都没听说过太low了)
例如 export PYTHONPATH=/home/ydf/codes/ydfhome
或者 export PYTHONPATH=./ (./是相对路径,前提是已近cd到你的项目根目录了,也可以写绝对路径全路径)
win cmd 设置环境变量语法是 set PYTHONPATH=/home/ydf/codes/ydfhome
win powershell 语法是 $env:PYTHONPATH = "/home/ydf/codes/ydfhome"
第二步:启动 funweb 的 flask app
win上这么做: python3 -m funboost.funweb.app
linux上可以这么做性能好一些,也可以按win的做: gunicorn -w 4 --threads=30 --bind 0.0.0.0:27018 funboost.funweb.app:app
使用浏览器打开 127.0.0.1(启动web服务的机器ip):27018,输入默认用户名 密码 admin 123456,即可打开函数运行状态和结果页面。
13.1.b 直接在代码中启动web start_funboost_web_manager() (方式二):
start_funboost_web_manager() 可以随着消费程序一起启动,也可以单独启动。
from funboost.funweb.app import start_funboost_web_manager
start_funboost_web_manager()
13.2 funweb 截图
设置关心的项目,设置 care_project_name,可以让界面仅显示你关心的项目的队列,减少无关返回信息的干扰。

函数消费结果:可查看和搜索函数实时消费状态和结果。对于失败的消息,在页面上用户可以点击重新运行按钮,方便一键重新投递到消息队列。

运行中消费者 by queue: 根据队列名字搜索有哪些消费者

队列操作:查看和操作队列,包括 清空清空 暂停消费 恢复消费 调整qps和并发

队列操作:查看消费曲线图,查看各种消费指标。
包括 历史运行次数 历史运行失败次数 近10秒完成 近10秒失败 近10秒函数运行平均耗时 累计函数运行平均耗时 剩余消息数量

rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;以及可根据taskid获取结果。

定时任务管理:列表页
[
]
13.3 funboost web 图片对应的测试代码
import asyncio
import time
import random
from funboost import boost, FunctionResultStatusPersistanceConfig, BoosterParams,BrokerEnum,ctrl_c_recv,ConcurrentModeEnum
from funboost.funweb.app import start_funboost_web_manager
class MyBoosterParams(BoosterParams):
project_name:str = 'test_project1' # 核心配置,项目名,设置后,web接口就可以只关心某个项目下的队列,减少无关返回信息的干扰。
broker_kind:str = BrokerEnum.REDIS
is_send_consumer_heartbeat_to_redis : bool= True # 向redis发送心跳,这样才能从redis获取相关队列的运行信息。
is_using_rpc_mode:bool = True # 必须设置这一个参数为True,才能支持rpc功能。
booster_group : str = 'test_group1' # 方便按分组启动消费
should_check_publish_func_params:bool = True # 发布消息时,是否检查消息内容是否正确,不正确的消息格式立刻从接口返回报错消息内容不正确。
function_result_status_persistance_conf: FunctionResultStatusPersistanceConfig = FunctionResultStatusPersistanceConfig(
is_save_result=True, is_save_status=True, expire_seconds=7 * 24 * 3600, is_use_bulk_insert=False)
@boost(MyBoosterParams(queue_name='queue_test_g01t',qps=1,))
def f(x):
time.sleep(5)
print(f'hi: {x}')
if random.random() > 0.9:
raise ValueError('f error')
return x + 1
@boost(MyBoosterParams(queue_name='queue_test_g02t',qps=0.5,
max_retry_times=0,))
def f2(x,y):
time.sleep(2)
print(f'hello: {x} {y}')
if random.random() > 0.5:
raise ValueError('f2 error')
return x + y
@boost(MyBoosterParams(queue_name='queue_test_g03t',qps=0.5,
max_retry_times=0,concurrent_mode=ConcurrentModeEnum.ASYNC))
async def aio_f3(x):
await asyncio.sleep(3)
print(f'f3aa: {x}')
if random.random() > 0.5:
raise ValueError('f3 error')
return x + 1
if __name__ == '__main__':
start_funboost_web_manager(port=27018) # 也可以在python代码中启动web,来启动 funweb funboost队列管理界面。可以不需要命令行来启动。
f.multi_process_consume(4)
f2.multi_process_consume(5)
aio_f3.consume()
for i in range(0, 1000000):
f.push(i)
f2.push(i)
aio_f3.push(i)
time.sleep(1)
ctrl_c_recv()
13.4 funweb 系统功能-脚本部署管理(爽功能)
funweb的 系统功能 说明
funweb 的系统功能 和 funboost分布式函数调度框架以及消息队列的关系不大。
因为你即使不用funboost框架运行消费,也可以使用funweb来部署脚本,监控服务器资源等。
这属于系统级功能,和你用不用funboost框架发布消息+执行消息没有个卵的关系。
🚀 funweb 的脚本部署 = Supervisor + Jenkins + ELK,却轻量得不像话
Funboost 让你在浏览器里一键管理任何语言的脚本:
角色 |
功能对标 |
Funboost 实现 |
|---|---|---|
👼 进程守护神 |
Supervisor |
进程启动、停止、重启、自动保活 |
🚀 自动发布机 |
Jenkins |
Git 拉取 + 分支切换 + 自动重启 |
📊 日志聚合中心 |
ELK |
关键字搜索、时间筛选、大文件支持、级别着色 |
核心优势:无需额外部署,开箱即用,轻量级一体化解决方案。
13.4.1 核心功能
部署管理:新建、编辑、复制、删除部署配置,配置项包括 部署名称、项目根目录、启动命令、环境变量。
进程控制:一键启动、停止、重启。支持配置多进程数量(默认1个),每个进程独立管理。
自动启动/自动重启:可配置
auto_start(web 服务启动时自动拉起)和auto_restart(进程崩溃后自动重启,可设最大连续重试次数,默认3次)。人工在页面停止的进程不会被自动重启。更新并重启:一键执行
git pull+ 重启,支持分支切换、模糊搜索分支,git 操作失败自动取消重启。日志查看:支持关键字搜索、按时间范围筛选(快捷按钮 + 自定义范围)、自动刷新。基于二分查找实现,兼容 10GB 级大日志文件。日志按级别着色显示(DEBUG 绿/INFO 青/WARNING 金黄/ERROR 粉红/CRITICAL 血红/print 天蓝)。
健康检查:启动后自动检测进程存活(可配置检查时长,默认10秒),进程秒退立即报错并显示日志尾部辅助诊断。
PID 安全:通过进程创建时间二次校验,防止系统重启后 PID 复用导致误判或误杀。
13.4.2 使用方式
启动 funweb 后,在左侧导航栏点击「脚本部署」进入。
新建部署示例:
配置项 |
示例值 |
|---|---|
部署名称 |
my_worker |
项目根目录 |
/home/user/my_project |
启动命令 |
python main.py |
进程数量 |
2 |
自动启动 |
✓ |
自动重启 |
✓ |
项目根目录会自动加入 PYTHONPATH。脚本以后台方式运行(Linux 用 nohup,Windows 用静默后台进程),关闭 web 管理页面或 Flask 进程不影响已部署的脚本运行。
stdout/stderr 自动重定向到 {日志目录}/{部署名称}.nohup.log,多进程时每个进程独立日志文件。
13.4.2.2 funboost 查看日志按时间筛选范围说明
如果你要按时间范围筛选日志,请用nb_log。
funboost 后台会搜索 时间字符串,所以你的print和日志最开头需要是 %Y-%M-%d %H:%m:%S ,建议你导入使用nb_log,print和日志自动有这样的时间前缀。
如果你不想用nb_log,还想支持日志按时间范围筛选,需要确保你的控制台输出,每个打印前面都是有这个时间前缀 %Y-%M-%d %H:%m:%S
13.4.3 funweb 脚本部署功能说明
脚本部署功能不依赖 funboost 框架本身,可以部署任意 Python 脚本甚至非 Python 命令,只要能在命令行运行即可。
部署配置持久化在 Redis 中,重启 web 服务后配置不丢失。
兼容 Windows 和 Linux。
13.4.4 脚本部署功能截图
脚本部署列表页截图

脚本部署详情页截图

13.4.5 降维打击:funweb 脚本部署为何完爆 Supervisor?
在传统的 Python 后端部署中,Supervisor 或是 Systemd 几乎是进程管理的“标配”。但对于只关心业务逻辑的开发者来说,这些系统级工具存在极高的心智负担:需要手写枯燥的 .ini 配置文件、缺乏代码更新能力、排查“秒退”报错极其痛苦,看日志还得 SSH 连上服务器敲 tail 命令。
funweb 内置的脚本部署功能,彻底打破了“开发”与“运维”的边界。它不仅完美覆盖了 Supervisor 的进程守护与自动重启能力,更在体验和底层技术上实现了全方位的降维打击:
13.4.5.1. 📝 纯 Web 可视化配置,告别反人类的 .ini 与环境变量地狱
Supervisor 的痛:部署一个新脚本,你必须登录服务器,小心翼翼地手写
.ini或.conf文件。尤其是配置PYTHONPATH或复杂的虚拟环境环境变量时,各种引号转义让人抓狂;少写一个分号进程就起不来。Funboost 的爽:纯 Web 可视化表单!启动命令、项目路径、环境变量(支持直接填 JSON)、多进程数量、失败重试次数,全部在网页上点选和填写。点击保存立刻生效,极大地降低了部署门槛。
神级附加功能:支持**一键复制(Clone)**部署配置!想把
Task A的部署方案微调后给Task B用?网页上点一下复制即可,而 Supervisor 需要你 SSH 上去cp a.ini b.ini然后再用vim修改。
13.4.5.2. ⚡️ 堪比 ELK 的神级日志检索(百G日志,毫秒级响应)
Supervisor 的痛:只能用
tail -f看实时日志。如果想按时间段或关键字搜索历史日志,要么拉取几 GB 的日志文件到本地导致电脑卡死,要么必须重金部署沉重的ELK (Elasticsearch + Logstash + Kibana)架构。Funboost 的爽:底层通过纯 Python 实现了基于时间戳的二分查找算法 (
O(log N)时间复杂度)。即使是高达 10GB+ 的超大nohup日志文件,也能在网页端毫秒级精准定位到任意时间范围内的日志,并且不占用服务器多余内存。自动高亮:根据日志级别(INFO/WARNING/ERROR 等),网页端自动渲染彩色大色块,错误堆栈一目了然。
13.4.5.3. 🚀 内置 CI/CD:兼具“发版平台”能力
Supervisor 的痛:它只是一个单纯的“进程看门狗”。每次更新代码,你依然需要手动连上服务器执行
git pull,然后再去执行supervisorctl restart xx。Funboost 的爽:将 代码拉取 与 进程重启 完美融合。
网页端自带
Git Pull按钮,自动检测本地与远程分支,支持下拉选择、无缝切换分支。点一下按钮,Funboost 会在后台全自动执行:Git 拉取 -> 解决环境路径 -> 优雅关闭旧进程 -> 拉起新进程。你直接拥有了一个轻量级的自动化发版平台。
13.4.5.4. 🛡️ 进程防误杀机制:解决 PID 复用的终极痛点
Supervisor 的痛:依赖 PID 文件(如
supervisord.pid)管理进程。如果服务器遭遇强制重启或 PID 文件未及时清理,操作系统会将原 PID 分配给其他无辜进程(比如 MySQL 进程),Supervisor 会错误地将该进程当成自己的子进程去监控甚至“强杀”,导致严重的生产事故。Funboost 的爽:底层源码中引入了极致的防御性编程。Funboost 不仅记录 PID,还通过调用 OS 底层 API(Windows 的
GetProcessTimes,Linux 的/proc/pid/stat)精确获取进程的系统级创建时间戳。在执行停止或重启操作时,必须同时校验PID + 创建时间双重特征。彻底杜绝了“杀错进程”的系统级 Bug,稳如泰山!
13.4.5.5. 🏥 智能健康检查与“秒退”精准诊断
Supervisor 的痛:如果代码有语法错误 (
SyntaxError) 或缺少依赖包 (ModuleNotFoundError),启动后进程会瞬间退出。Supervisor 只会冷冰冰地显示一个FATAL状态,你只能自己去翻找错误日志。Funboost 的爽:自带启动健康检查等待期(如默认 10 秒)。
如果进程在这几秒内“秒退”,Funboost 不仅会立即在网页弹窗报错,还会自动抓取该进程死亡前输出的最后数十行日志尾部(Traceback 错误堆栈),直接展示在 Web 弹窗里!你连日志页面都不用进,立刻就能知道代码错在哪。
13.4.5.6. 💻 真正的跨平台支持与“零特权”部署 (Win/Linux 双端通吃)
Supervisor 的痛:原生不支持 Windows。在 Windows 服务器上部署 Python 后台任务简直是开发者的噩梦。此外,在 Linux 下安装和配置 Supervisor 通常需要
root权限。Funboost 的爽:
双端一致:底层代码对 OS 进行了精密的兼容处理。无论你的服务器是 Linux 还是 Windows,Web 端的操作体验完全一致(底层智能调用
kill -9或taskkill /F /PID)。用户态运行:Funboost 的守护线程和部署逻辑完全运行在普通用户权限下,无需
root,无需修改系统级服务文件,对缺乏服务器高权限的开发者极其友好。
13.4.5.7. 👁️ 告别黑箱,极致的透明操作反馈
传统运维工具的痛:点击操作后,页面转个圈就提示“成功”或“失败”,底层到底执行了什么命令,执行目录在哪,开发者一无所知。
Funboost 的爽:每一次启动、停止、重启或 Git 操作,网页都会弹框实时、透明地显示底层执行的完整 Shell 命令细节、绝对工作路径以及解析后的环境变量(例如:
nohup python xxx.py --deploy_flag=UUID >> log.log 2>&1 &)。这种极致的透明度,给了开发者绝对的安全感和掌控感。
💡 终极总结: Funboost 的脚本部署模块,本质上是将繁重的运维基建(Supervisor + Jenkins + ELK日志部分)打包降维成了一个轻量级的 Web 页面。它不仅是进程看门狗,更是专为 Python 开发者量身定制的“现代化 DevOps 中枢”,让你在浏览器里就能优雅地掌控所有算力!
13.4.6 funweb 是否支持远程部署(部署到其他机器)?
答:funweb 可以在你自己的电脑开浏览器,打开网址,点击部署到远程机器。
例如你的linux机器ip是 10.1.2.3 你在linux机器部署启动 funweb ,暴露端口,假设端口是 27011
然后你再自己的浏览器,打开 10.1.2.3/27011 ,登录,点击网页左侧脚本部署模块
你点击 更新重启 按钮就可以更新拉取git仓库代码,并启动脚本。
13.4.6.2 Funboost 部署 vs 传统 Jenkins 发版平台:为什么我们选择“本地化”?
传统的 Jenkins 或运维魔改的发版平台,采用的是中心化架构:由一台发版服务器通过 SSH 远程把代码分发到多台机器上,目标机器不需要运行 Web 服务。 客观地说,如果你要把同一个服务同时滚动发布到 10 几台甚至上百台机器,Jenkins 确实更省力。
但是,对于中小型 Python 任务、爬虫脚本的部署,funweb 这种“直接跑在目标机器上”的去中心化模式,带来了 Jenkins 无法企及的爽感:
配置难度骤降 10 倍:在 Jenkins 里配一个新项目,你要搞 SSH 密钥、写 Pipeline 脚本、配置工作空间,繁琐至极。在 Funboost 里,只需填个本地目录和启动命令,点下保存,10 秒钟直接搞定!
丝滑的“本地级”操控:因为 Web Manager 就跑在目标机器上,它无需忍受 SSH 网络延迟。健康检查、探活、自动重启,全部直接调用操作系统的底层 API(如读取
/proc或 Windows 进程句柄),毫秒级响应,极其稳定且防误杀。本地日志光速直读:不需要通过 SSH 缓慢拉取日志,也不需要搞复杂的 ELK 收集链路。直接基于本地磁盘文件做时间戳二分查找,10G 级别的日志随搜随出,所见即所得。
零 DevOps 依赖:不需要求着专业运维去搭 Jenkins 集群,任何一个懂点 Python 的普通开发者,自己敲一行
python -m funboost.funweb.app,就能瞬间把服务器变成一个好用的自动化发版平台。
13.4.7 降维打击:Funboost Web 部署比直接用 Xshell 爽在哪里?
很多老鸟习惯了直接用 Xshell、SecureCRT 连上服务器敲命令行。但一旦你用过 Funboost 的 Web 脚本部署,就会发现传统的 SSH 操作有多么反人类:
13.4.7.1. 🔌 告别繁琐的登录与“断连焦虑”
Xshell 的痛:每次部署都要走一套繁琐的流程:开 VPN -> 找主机 IP -> 输密码/配密钥。最恶心的是,现在的服务器为了安全风控都有超时机制,切出去看个文档,回来连接就断了,又得重新登录。
Funboost 的爽:只要浏览器标签页没关,随时刷新随时看,状态永远在线,彻底治愈你的断连焦虑。
13.4.7.2. 🖱️ 零门槛“傻瓜式”操作,彻底解放开发者
Xshell 的痛:敲命令不仅容易拼错,协同成本更是灾难。当你改了代码,想让测试妹子去重启验证时,面对习惯了“点点点”的 QA,你教她 10 遍
git pull && nohup python ...她也学不会,最后还是得你亲自去敲。Funboost 的爽:把 URL 丢给测试/前端/产品,告诉他们:“想测最新代码,自己去页面点一下【Git Pull】和【重启】”。全程点鼠标,绝不犯错,把开发从枯燥的“人肉发版机”中彻底解放出来。
13.4.7.3. 👁️ 拒绝“黑盒启动”,所见即所得的存活监控
Xshell 的痛:敲完
nohup ... &后心里直打鼓,根本不知道启动成功没有。每次都得习惯性地再敲一遍ps aux | grep xxx去核对进程名和 PID,确认它还活着。Funboost 的爽:启动后,网页直接亮起绿灯,清晰展示当前存活的 PID 列表和持续运行时间。如果发生“秒退”,会直接把错误堆栈抓取并弹窗糊你脸上,再也不用像个瞎子一样去猜进程死没死。
13.4.7.4. 📖 降维打击的日志查阅体验,终结反人类的 grep
Xshell 的痛:查日志极其痛苦。
时间范围难查:用
awk或sed截取特定时间段的日志,语法复杂到让人怀疑人生。多行报错支离破碎:用
grep搜关键字,一旦遇到跨行的异常堆栈(Traceback),只能搜出孤零零的一行,根本看不出完整的报错上下文。
Funboost 的爽:提供极简的时间范围选择器和关键字检索。基于时间戳二分查找,百G日志毫秒级出结果;完美保留多行异常堆栈的完整上下文,自带彩色高亮。相当于白嫖了一个轻量级的 ELK 日志系统。
13.4.7.5. 🛡️ 自带“死而复生”的进程守护,远超脆弱的 nohup
Xshell 的痛:用
nohup xxx &跑爬虫或后台任务,一旦遇到网络超时、未捕获异常或者内存溢出(OOM),进程死了就真死了。大半夜挂掉,第二天早上才发现数据断更。Funboost 的爽:网页上勾选
自动重启 (auto_restart),框架内置的后台守护线程会每 10 秒巡检一次。进程一旦意外死亡,**直接原地满血拉起!**你相当于白嫖了一个轻量级的 Supervisor。
13.4.7.6. 🧬 配置资产沉淀,告别“祖传 txt 小本本”
Xshell 的痛:启动一个复杂的 Python 项目,你需要先激活虚拟环境,再 export
PYTHONPATH=/xxx/yyy,最后跟上一大串启动参数。时间一长根本记不住,只能在电脑桌面建个常用命令.txt每次复制粘贴,换台电脑就抓瞎。Funboost 的爽:你的启动命令、工作目录、乃至复杂的环境变量(JSON格式),全部作为配置资产永久固化在服务端。三年后回来看,点一下“启动”照样丝滑运行,甚至还能一键 Clone 出一个新配置。
13.4.7.7. 🎯 精准狙击 PID,彻底杜绝“同名误杀”惨案
Xshell 的痛:服务器上同时跑着 20 个
python main.py,你想停掉其中某个旧版任务。用ps -ef | grep python查出来一堆长得一模一样的进程,肉眼分辨极度痛苦;一怒之下用pkill python,结果把同事跑的、或者其他核心业务的 Python 进程全给“误杀”了,直接引发 P0 级生产事故。Funboost 的爽:框架底层严格记录了自己拉起的每一个进程的
PID和OS级创建时间戳。点击“停止”时,它只杀自己管辖的进程,指哪打哪,绝对安全,把你从提心吊胆的kill -9中解救出来。
13.4.7.8. ⚖️ 傻瓜式的一键“多进程”横向扩容
Xshell 的痛:发现单进程消费太慢,想开 10 个进程提速?你要么在 Shell 里像个机器一样按 10 次“上箭头+回车”,要么现场手搓一个 bash 的
for循环脚本。Funboost 的爽:网页表单里有个【进程数】填空框。把 1 改成 10,点击重启。10 个独立的 Python 进程瞬间整齐划一地拉起。横向扩容,只需修改一个数字。
13.5 funweb 系统功能-资源监控
你把funweb部署在任何电脑,就能持续采集和监控该电脑的cpu 内存 磁盘使用率了。
实现方式是有个线程,每隔10秒使用psutil采集服务器的资源使用率,保存到redis zset中。
funweb页面展示这些指标的实时仪表盘以及长期走势曲线。
实现代码在 funboost\funweb\system_monitor.py
funweb 系统功能-资源监控 截图

13.6 📖 funweb 系统功能 - 通用日志查看器
funweb 内置的日志查看器是一个功能强大的系统级组件。它旨在为开发者提供一个开箱即用、脱离 SSH 终端的 Web 日志排查方案。
13.6.2 ✨ 功能亮点
绝对通用的文件读取
不限编程语言:支持查看 Python, Java, Go 等任意语言生成的日志文件。
不限部署方式:完全独立于
funweb的“脚本部署”功能。无论程序是nohup挂起还是作为系统服务运行,只要是文本文件,皆可查看。
强大的检索与过滤
支持按精确的时间段(起止时间)对日志进行截取筛选。
支持对日志内容进行关键字搜索,快速定位异常(Exception/Error)堆栈。
极致的实时监控 (
tail -f体验)底层采用 SSE (Server-Sent Events) 单向事件流技术(
mimetype='text/event-stream')。实现以毫秒级极低延迟,将服务器产生的最新日志增量实时推送到网页端,拒绝卡顿与重复加载。
日志查看器截图
眼又极其清晰的“彩色日志” 这绝对是排查问题的最大爽点!传统的 tail -f 往往是一坨黑白乱码,看久了眼睛疼。






