Superset二次开发之源码 run-server.sh 分析
背景:
如果基于docker方式部署Superset项目,Dockerfile文件末尾指向了docker-ci.sh,而docker-ci.sh 脚本又指向了run-server.sh。因此我们重点分析一下run-server脚本
路径 docker\run-server.sh
#!/usr/bin/env bashHYPHEN_SYMBOL='-'gunicorn \--bind "${SUPERSET_BIND_ADDRESS:-0.0.0.0}:${SUPERSET_PORT:-8088}" \--access-logfile "${ACCESS_LOG_FILE:-$HYPHEN_SYMBOL}" \--error-logfile "${ERROR_LOG_FILE:-$HYPHEN_SYMBOL}" \--workers ${SERVER_WORKER_AMOUNT:-1} \--worker-class ${SERVER_WORKER_CLASS:-gthread} \--threads ${SERVER_THREADS_AMOUNT:-20} \--timeout ${GUNICORN_TIMEOUT:-60} \--keep-alive ${GUNICORN_KEEPALIVE:-2} \--max-requests ${WORKER_MAX_REQUESTS:-0} \--max-requests-jitter ${WORKER_MAX_REQUESTS_JITTER:-0} \--limit-request-line ${SERVER_LIMIT_REQUEST_LINE:-0} \--limit-request-field_size ${SERVER_LIMIT_REQUEST_FIELD_SIZE:-0} \"${FLASK_APP}"
以上命令是用来启动一个 Gunicorn 服务器的脚本,Gunicorn 是一个 Python WSGI HTTP 服务器,常用于部署 Flask 和其他 WSGI 应用。以下是对这段命令的详细分析和解释:
各个参数的解释
`gunicorn` : 启动 Gunicorn 服务器的命令。
- `--bind` : 指定服务器监听的地址和端口。`${SUPERSET_BIND_ADDRESS:-0.0.0.0}` 表示如果环境变量 `SUPERSET_BIND_ADDRESS` 未设置,则默认绑定到 `0.0.0.0`(即所有可用的网络接口)。`${SUPERSET_PORT:-8088}` 表示如果环境变量 `SUPERSET_PORT` 未设置,则默认使用端口 `8088`。
- `--access-logfile` : 指定访问日志文件的路径。`${ACCESS_LOG_FILE:-$HYPHEN_SYMBOL}` 表示如果环境变量 `ACCESS_LOG_FILE` 未设置,则使用 `$HYPHEN_SYMBOL`(通常是 `-`,表示输出到标准输出)。
- `--error-logfile` : 指定错误日志文件的路径。`${ERROR_LOG_FILE:-$HYPHEN_SYMBOL}` 表示如果环境变量 `ERROR_LOG_FILE` 未设置,则使用 `$HYPHEN_SYMBOL`。
- `--workers` : 指定工作进程的数量。`${SERVER_WORKER_AMOUNT:-1}` 表示如果环境变量 `SERVER_WORKER_AMOUNT` 未设置,则默认使用 `1` 个工作进程。增加工作进程可以提高并发处理能力。
- `--worker-class` : 指定工作进程的类型。`${SERVER_WORKER_CLASS:-gthread}` 表示如果环境变量 `SERVER_WORKER_CLASS` 未设置,则默认使用 `gthread`(基于线程的工作进程)。可以根据需要选择不同的工作类,如 `sync`、`eventlet`、`gevent` 等。
- `--threads` : 指定每个工作进程的线程数。`${SERVER_THREADS_AMOUNT:-20}` 表示如果环境变量 `SERVER_THREADS_AMOUNT` 未设置,则默认使用 `20` 个线程。适用于处理 I/O 密集型任务。
- `--timeout` : 指定请求超时时间(秒)。`${GUNICORN_TIMEOUT:-60}` 表示如果环境变量 `GUNICORN_TIMEOUT` 未设置,则默认超时为 `60` 秒。
- `--keep-alive` : 指定保持连接的时间(秒)。`${GUNICORN_KEEPALIVE:-2}` 表示如果环境变量 `GUNICORN_KEEPALIVE` 未设置,则默认保持连接 `2` 秒。
- `--max-requests` : 指定每个工作进程在重启之前处理的最大请求数。`${WORKER_MAX_REQUESTS:-0}` 表示如果环境变量 `WORKER_MAX_REQUESTS` 未设置,则默认值为 `0`(表示不限制)。
- `--max-requests-jitter` : 指定在重启工作进程时的随机延迟(秒)。`${WORKER_MAX_REQUESTS_JITTER:-0}` 表示如果环境变量 `WORKER_MAX_REQUESTS_JITTER` 未设置,则默认值为 `0`。
- `--limit-request-line` : 指定请求行的最大字节数。`${SERVER_LIMIT_REQUEST_LINE:-0}` 表示如果环境变量 `SERVER_LIMIT_REQUEST_LINE` 未设置,则默认值为 `0`(表示不限制)。
- `--limit-request-field_size` : 指定请求头字段的最大字节数。`${SERVER_LIMIT_REQUEST_FIELD_SIZE:-0}` 表示如果环境变量 `SERVER_LIMIT_REQUEST_FIELD_SIZE` 未设置,则默认值为 `0`(表示不限制)。
- `${FLASK_APP}` : 指定要运行的 Flask 应用程序的模块或包名。这个变量通常在环境中设置,指向 Flask 应用的入口。
总结
这段命令通过 Gunicorn 启动一个 Flask 应用,配置了多种参数以优化性能和日志记录。通过使用环境变量,用户可以灵活地调整服务器的行为,适应不同的部署需求。整体上,这段命令为 Superset 提供了一个可扩展和高效的运行环境。
相关文章:
Superset二次开发之源码 run-server.sh 分析
背景: 如果基于docker方式部署Superset项目,Dockerfile文件末尾指向了docker-ci.sh,而docker-ci.sh 脚本又指向了run-server.sh。因此我们重点分析一下run-server脚本 路径 docker\run-server.sh #!/usr/bin/env bashHYPHEN_SYMBOL-gunicorn…...
Java 之四种内部类详解
在 Java 中,除了传统的类定义方式之外,还有一种特殊的类定义方式——内部类。内部类定义在另一个类的内部,可以访问外部类的成员,这使得代码更加灵活和可读性更强。本文将详细讲解 Java 中四种内部类的类型:成员内部类…...

03:手动可变电阻
可变电阻 1、电位器2、变阻器/数字电位器2.1:变阻器2.2:数字电位器 3、电位器锥度4、寄生电感/电容 1、电位器 如上图所示:将可变的电阻作为分压器,那么这种可变的电阻就是电位器。例如:将L1连接负极,L3连接…...
嵌入式Linux电池管理(TODO)
(TODO) 在树莓派3B上使用电池供电需要考虑多个方面,包括电源管理、硬件连接和软件配置。以下是详细的步骤和建议: 1. 选择合适的电池 树莓派3B需要5V的电源供电,通常电流需求在2.5A左右。常见的电池选择包括࿱…...

Python 求亲和数
亲和数(Amicable Numbers)是指两个不同的正整数,它们的真因数(即除去本身的所有因数)之和与对方的数相等。 def sum_of_proper_divisors(n):"""计算一个数的真因子之和"""divisors_su…...

【C++】——vector模拟实现和迭代器失效问题
文章目录 模拟实现vector基本成员变量vector的构造与析构vector迭代器vector容量vector元素访问vector修改操作 vector迭代器失效问题什么是迭代器失效1.插入元素导致迭代器失效2.删除元素导致迭代器失效3.重新分配空间导致迭代器失效 如何解决迭代器失效问题 模拟实现 vector…...

USB 3.1 标准 A 型连接器及其引脚分配
USB 3.1 标准 A 型连接器 USB 3.1 标准 A 型连接器被定义为主机连接器。它具有与 USB 2.0 标准 A 型连接器相同的配合接口,但增加了另外两对差分信号和一个接地引脚。 USB 3.1 标准 A 型插座可以接受 USB 3.1 标准 A 型插头或 USB 2.0 标准 A 型插头。类似地&…...

机器学习文献|基于循环细胞因子特征,通过机器学习算法预测NSCLC免疫治疗结局
今天我们一起学习一篇最近发表在Journal for immunotherapy of cancer (IF 10.9)上的文章,Machine learning for prediction of immunotherapeutic outcome in non-small-cell lung cancer based on circulating cytokine signatures[基于循环…...

Qt 实现自定义截图工具
目录 Qt 实现自定义截图工具实现效果图PrintScreen 类介绍PrintScreen 类的主要特性 逐步实现第一步:类定义第二步:初始化截图窗口第三步:处理鼠标事件第四步:计算截图区域第五步:捕获和保存图像 完整代码PrintScreen.…...

第15-05章:获取运行时类的完整结构
我的后端学习大纲 我的Java学习大纲 6.1.第一组方法API: 1.API列表:java.lang.Class 类: 2.代码测试: public class ReflectionUtils{ puvblic static void main(String[] args){}// 第一组Testpublic void api_01{//上面截图的代码......…...

【Kubernetes】K8s 的鉴权管理(二):基于属性 / 节点 / Webhook 的访问控制
K8s 的鉴权管理(二):基于属性 / 节点 / Webhook 的访问控制 1.基于属性的访问控制(ABAC 鉴权)2.基于节点的访问控制(node 鉴权)2.1 读取操作2.2 写入操作 3.基于 Webhook 的访问控制3.1 基于 We…...

Java面试、技巧、问题、回复,资源面面观
入门 先了解一下面试流程 复习 Java 基础知识: 温习 Java 编程的核心概念,包括数据类型、变量、循环、数组和面向对象的编程原则。数据结构和算法: 加强您对 Java 编程中使用的基本数据结构和算法的理解。练习编码: 在各种平台上解…...
深入理解Elasticsearch的`_source`字段与索引优化
在Elasticsearch (ES) 中,_source字段是一个关键组件,它不仅决定了数据的存储方式,还影响到查询时返回的内容。在某些场景下,我们可以通过配置_source来优化存储和性能,尤其是当我们希望减少存储空间或避免返回某些字段…...

Pikachu靶场
先来点鸡汤,少就是多,慢就是快。 环境搭建 攻击机kali 192.168.146.140 靶机win7 192.168.146.161 下载zip,pikachu - GitCode 把下载好的pikachu-master,拖进win7,用phpstudy打开网站根目录,.....再用…...
TS axios封装
方式一 service/request/request.ts import axios from axios import { ElLoading } from element-plus import type { AxiosRequestConfig, AxiosInstance, AxiosResponse } from axios import type { ILoadingInstance } from element-plus/lib/el-loading/src/loading.typ…...

学会使用西门子博途Startdrive中的测量功能
工程师在驱动调试过程中,往往需要对驱动系统的性能进行分析及优化,比如说借助于调试软件中的驱动器测量功能,可以得到驱动系统的阶跃响应、波特图等,以此为依据工程师可以调整速度控制器、电流控制器的相关参数,使驱动…...

Spring Security认证与授权
1 Spring Security介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统中的一员,因此它伴随着整个Spring生态系统不断修正、升级,在spring boot项目中加入springsecurity更是…...

速通GPT:Improving Language Understanding by Generative Pre-Training全文解读
文章目录 速通GPT系列几个重要概念1、微调的具体做法2、任务感知输入变换3、判别式训练模型 Abstract概括分析和观点1. 自然语言理解中的数据问题2. 生成预训练和监督微调的结合3. 任务感知输入变换4. 模型的强大性能 Introduction概括分析和观点1. 自然语言理解的挑战在于对标…...

软件质量保证例题
答案:D 软件质量保证 功能性 适合性 准确性 互操作性 安全保密性 依从性 可靠性 成熟性 容错性 易恢复性 易用性 易理解性 易学性 易操作性 效率 时间特性 资源利用性 维护性 易分析性 易改变性 稳定性 易测试性 可移植性 适应性 易安装性 一致性 易替换…...

动态规划算法---04.斐波那契数列模型_解码方法_C++
题目链接:91. 解码方法 - 力扣(LeetCode)https://leetcode.cn/problems/decode-ways/description/ 一、题目解析 题目: 题目大意:从题目中我们可以知道,解码就是在字符串s中由‘1’到‘26’的字符可以转化…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...