Supervisor进程管理

news2024/11/25 4:34:29

Supervisor进程管理

概述:supervisor 是一个用 python 语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor 监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制。

1.构成要素

  • Supervisord:

    • supervisor的服务端:运行supervisor时会启动一个进程supervisord;
    • 它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动;
    • 而且可以在所管理的进程出现崩溃时自动重启;
  • supervisorctl

    • supervisor 的客户端:supervisorctl 是命令行管理工具,可以用命令来进行子进程的管理

    • supervisorctl 常见命令

      命令含义
      supervisorctl status查看所有子进程的服务状态
      supervisorctl restart重启所有子进程服务
      supervisorctl restart name重启子进程名字为 name 的服务
      supervisorctl start name开启子进程为 name 的服务
      supervisorctl stop all关闭所有子进程服务
      supervisorctl stop name停止子进程为 name 的服务
      supervisorctl shutdown关闭所有的子进程服务,同时关闭supervisor工具本身
      supervisorctl reload重载配置文件,重启所有子进程服务
      supervisorctl update更新所有服务,一般用在添加新服务后
      supervisorctl update name更新子进程名字为 name 的服务
  • echo_supervisord_conf

    • echo_supervisord_conf是Supervisor的一个内置命令,用于生成Supervisor配置文件的模板。使用该命令可以快速生成一个示例的Supervisor配置文件,然后根据需要进行修改和扩展。

    • 要使用echo_supervisord_conf命令,您需要执行以下步骤:

      # 1. 打开终端或命令行窗口。
      # 2. 运行以下命令:
      echo_supervisord_conf > supervisord.conf
      

      这会将Supervisor的模板配置文件输出到名为 supervisord.conf 的文件中。

      1. 打开生成的 supervisord.conf 文件,您将看到一个模板配置文件的内容。

        该文件包含了一些示例的配置段,如[unix_http_server][supervisord][supervisorctl],以及一些默认设置的注释说明。

      2. 根据您的实际需求,在 supervisord.conf 文件中进行修改和扩展,添加您自己的进程配置。您可以指定进程的命令、日志文件路径、启动和停止脚本等。

      3. 保存修改后的 supervisord.conf 文件。

      现在,您可以使用生成的 supervisord.conf 文件作为Supervisor的配置文件,并通过 supervisord 命令启动Supervisor,以管理您的进程。请确保在启动 supervisord 前已经安装好了Supervisor,并将 supervisord 命令添加到系统的服务启动项或以守护进程的方式运行。

    • 产生的模板文件

      ; Sample supervisor config file.
      ;
      ; For more information on the config file, please see:
      ; http://supervisord.org/configuration.html
      ;
      ; Notes:
      ;  - Shell expansion ("~" or "$HOME") is not supported.  Environment
      ;    variables can be expanded using this syntax: "%(ENV_HOME)s".
      ;  - Quotes around values are not supported, except in the case of
      ;    the environment= options as shown below.
      ;  - Comments must have a leading space: "a=b ;comment" not "a=b;comment".
      ;  - Command will be truncated if it looks like a config file comment, e.g.
      ;    "command=bash -c 'foo ; bar'" will truncate to "command=bash -c 'foo ".
      ;
      ; Warning:
      ;  Paths throughout this example file use /tmp because it is available on most
      ;  systems.  You will likely need to change these to locations more appropriate
      ;  for your system.  Some systems periodically delete older files in /tmp.
      ;  Notably, if the socket file defined in the [unix_http_server] section below
      ;  is deleted, supervisorctl will be unable to connect to supervisord.
      
      [unix_http_server]
      file=/tmp/supervisor.sock   ; the path to the socket file
      ;chmod=0700                 ; socket file mode (default 0700)
      ;chown=nobody:nogroup       ; socket file uid:gid owner
      ;username=user              ; default is no username (open server)
      ;password=123               ; default is no password (open server)
      
      ; Security Warning:
      ;  The inet HTTP server is not enabled by default.  The inet HTTP server is
      ;  enabled by uncommenting the [inet_http_server] section below.  The inet
      ;  HTTP server is intended for use within a trusted environment only.  It
      ;  should only be bound to localhost or only accessible from within an
      ;  isolated, trusted network.  The inet HTTP server does not support any
      ;  form of encryption.  The inet HTTP server does not use authentication
      ;  by default (see the username= and password= options to add authentication).
      ;  Never expose the inet HTTP server to the public internet.
      
      ;[inet_http_server]         ; inet (TCP) server disabled by default
      ;port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface
      ;username=user              ; default is no username (open server)
      ;password=123               ; default is no password (open server)
      
      [supervisord]
      logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
      logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
      logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
      loglevel=info                ; log level; default info; others: debug,warn,trace
      pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
      nodaemon=false               ; start in foreground if true; default false
      minfds=1024                  ; min. avail startup file descriptors; default 1024
      minprocs=200                 ; min. avail process descriptors;default 200
      ;umask=022                   ; process file creation umask; default 022
      ;user=supervisord            ; setuid to this UNIX account at startup; recommended if root
      ;identifier=supervisor       ; supervisord identifier, default is 'supervisor'
      ;directory=/tmp              ; default is not to cd during start
      ;nocleanup=true              ; don't clean up tempfiles at start; default false
      ;childlogdir=/tmp            ; 'AUTO' child log dir, default $TEMP
      ;environment=KEY="value"     ; key value pairs to add to environment
      ;strip_ansi=false            ; strip ansi escape codes in logs; def. false
      
      ; The rpcinterface:supervisor section must remain in the config file for
      ; RPC (supervisorctl/web interface) to work.  Additional interfaces may be
      ; added by defining them in separate [rpcinterface:x] sections.
      
      [rpcinterface:supervisor]
      supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
      
      ; The supervisorctl section configures how supervisorctl will connect to
      ; supervisord.  configure it match the settings in either the unix_http_server
      ; or inet_http_server section.
      
      [supervisorctl]
      serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
      ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
      ;username=chris              ; should be same as in [*_http_server] if set
      ;password=123                ; should be same as in [*_http_server] if set
      ;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
      ;history_file=~/.sc_history  ; use readline history if available
      
      ; The sample program section below shows all possible program subsection values.
      ; Create one or more 'real' program: sections to be able to control them under
      ; supervisor.
      
      ;[program:theprogramname]
      ;command=/bin/cat              ; the program (relative uses PATH, can take args)
      ;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
      ;numprocs=1                    ; number of processes copies to start (def 1)
      ;directory=/tmp                ; directory to cwd to before exec (def no cwd)
      ;umask=022                     ; umask for process (default None)
      ;priority=999                  ; the relative start priority (default 999)
      ;autostart=true                ; start at supervisord start (default: true)
      ;startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
      ;startretries=3                ; max # of serial start failures when starting (default 3)
      ;autorestart=unexpected        ; when to restart if exited after running (def: unexpected)
      ;exitcodes=0                   ; 'expected' exit codes used with autorestart (default 0)
      ;stopsignal=QUIT               ; signal used to kill process (default TERM)
      ;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
      ;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
      ;killasgroup=false             ; SIGKILL the UNIX process group (def false)
      ;user=chrism                   ; setuid to this UNIX account to run the program
      ;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
      ;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
      ;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
      ;stdout_logfile_backups=10     ; # of stdout logfile backups (0 means none, default 10)
      ;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
      ;stdout_events_enabled=false   ; emit events on stdout writes (default false)
      ;stdout_syslog=false           ; send stdout to syslog with process name (default false)
      ;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
      ;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
      ;stderr_logfile_backups=10     ; # of stderr logfile backups (0 means none, default 10)
      ;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
      ;stderr_events_enabled=false   ; emit events on stderr writes (default false)
      ;stderr_syslog=false           ; send stderr to syslog with process name (default false)
      ;environment=A="1",B="2"       ; process environment additions (def no adds)
      ;serverurl=AUTO                ; override serverurl computation (childutils)
      
      ; The sample eventlistener section below shows all possible eventlistener
      ; subsection values.  Create one or more 'real' eventlistener: sections to be
      ; able to handle event notifications sent by supervisord.
      
      ;[eventlistener:theeventlistenername]
      ;command=/bin/eventlistener    ; the program (relative uses PATH, can take args)
      ;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
      ;numprocs=1                    ; number of processes copies to start (def 1)
      ;events=EVENT                  ; event notif. types to subscribe to (req'd)
      ;buffer_size=10                ; event buffer queue size (default 10)
      ;directory=/tmp                ; directory to cwd to before exec (def no cwd)
      ;umask=022                     ; umask for process (default None)
      ;priority=-1                   ; the relative start priority (default -1)
      ;autostart=true                ; start at supervisord start (default: true)
      ;startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
      ;startretries=3                ; max # of serial start failures when starting (default 3)
      ;autorestart=unexpected        ; autorestart if exited after running (def: unexpected)
      ;exitcodes=0                   ; 'expected' exit codes used with autorestart (default 0)
      ;stopsignal=QUIT               ; signal used to kill process (default TERM)
      ;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
      ;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
      ;killasgroup=false             ; SIGKILL the UNIX process group (def false)
      ;user=chrism                   ; setuid to this UNIX account to run the program
      ;redirect_stderr=false         ; redirect_stderr=true is not allowed for eventlisteners
      ;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
      ;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
      ;stdout_logfile_backups=10     ; # of stdout logfile backups (0 means none, default 10)
      ;stdout_events_enabled=false   ; emit events on stdout writes (default false)
      ;stdout_syslog=false           ; send stdout to syslog with process name (default false)
      ;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
      ;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
      ;stderr_logfile_backups=10     ; # of stderr logfile backups (0 means none, default 10)
      ;stderr_events_enabled=false   ; emit events on stderr writes (default false)
      ;stderr_syslog=false           ; send stderr to syslog with process name (default false)
      ;environment=A="1",B="2"       ; process environment additions
      ;serverurl=AUTO                ; override serverurl computation (childutils)
      
      ; The sample group section below shows all possible group values.  Create one
      ; or more 'real' group: sections to create "heterogeneous" process groups.
      
      ;[group:thegroupname]
      ;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions
      ;priority=999                  ; the relative start priority (default 999)
      
      ; The [include] section can just contain the "files" setting.  This
      ; setting can list multiple files (separated by whitespace or
      ; newlines).  It can also contain wildcards.  The filenames are
      ; interpreted as relative to this file.  Included files *cannot*
      ; include files themselves.
      
      ;[include]
      ;files = relative/directory/*.ini
      

2.安装

本部分主要介绍ubuntu系统中进行安装的方式,其他系统中百度亦可;

2.1 使用 apt 安装

  1. 更新软件包列表:

    sudo apt update
    
  2. 安装Supervisor:

    sudo apt install supervisor
    
  3. 启动Supervisor服务:

    sudo systemctl start supervisor
    
  4. 验证Supervisor是否已经启动:

    sudo systemctl status supervisor
    

2.2 使用pip安装

# supervisor是基于python写的,所以使用pip来安装即可。
pip install supervisor
或者
pip3 install supervisor 

# 默认生成文件的路径
# supervisord 路径
/usr/local/bin/supervisord
# supervisorctl 路径
/usr/local/bin/supervisorctl
# echo_supervisord_conf 路径
/usr/local/bin/echo_supervisord_conf

如上路径,我们也可以通过whereis supervisordwhereis supervisorctlwhereis echo_supervisord_conf得到

验证是否安装成功supervisorctl --help

3.配置详解

supervisor 进程管理服务程序安装完毕后,会在系统同中生成两个配置文件:

主进程配置文件:/etc/supervisor/supervisord.conf

子进程配置文件: /etc/supervisor/conf.d;子进程可能有多个配置文件;

3.1 默认主配置文件

supervisor 进程默认产生的配置文件如下所示;

image-20230916184052736

内容详解

; supervisor config file

[unix_http_server]  ; 将unix_http_server 下的 file 路径改成如下内容
file=/var/run/supervisor.sock   ; (the path to the socket file)
chmod=0700                       ; sockef file mode (default 0700)

;unix_http_server 下的 file 路径改成如下内容
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)

;以下部分必须保留在RPC的配置文件中
;(supervisorctl/web接口)要工作,可以使用其他接口
;通过在单独的rpcinterface:节中定义它们来添加
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

;supervisor 客户端
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket


;[include]部分可以只包含“files”设置。这
;设置可以列出多个文件(用空格或
;换行符)。它还可以包含通配符。文件名为
;解释为相对于此文件。包含的文件*不能*
;包括文件本身。
[include]  ; 包括路径下的所有文件;
files = /etc/supervisor/conf.d/*.conf

上面的路径只是推荐路径,可以根据自己的想法指向不同的路径;

# 创建文件
#touch /var/run/supervisor.sock  # 依据配置文件自动创建

mkdir /var/log/supervisor
touch /var/log/supervisor/supervisord.log

#touch /var/run/supervisord.pid  # 依据配置文件自动创建
mkdir /etc/supervisor/conf.d
# 添加权限
#chmod 777 /var/run 
#chmod 777 /var/log

3.2 子进程服务常用的配置解析

**说明:**更详细的配置参考模板部分的信息,使用的时候通常将该文件放在conf.d目录下;

[program:your_program_name]
command=/path/to/your_executable --arg1=value1 --arg2=value2  ; 子进程的启动命令及参数
directory=/path/to/your_working_directory                  ; 子进程的工作目录
user=your_username                                        ; 子进程运行的用户
autostart=true                                            ; 设置为自动启动子进程
autorestart=true                                          ; 允许自动重启
startretries=3                                            ; 启动重试次数
redirect_stderr=true                                      ; 将标准错误输出重定向到Supervisor日志
stdout_logfile=/path/to/your_stdout_log_file               ; 子进程的标准输出日志路径

4. 配置案例

主要用来描述并编写常见的supervisor相关的系统,主要有djangoflaskpython 脚本nginxmysqldocker等常见进程工具的部署后的进程监控的配置;

4.1 django 程序监控的配置

[program:your_django_program]
command=/path/to/your_virtualenv/bin/gunicorn your_django_project.wsgi:application --bind 127.0.0.1:8000  ; Django程序的启动命令
directory=/path/to/your_django_project                  ; Django程序的根目录
user=your_username                                      ; Django程序运行的用户
autostart=true                                          ; 设置为自动启动
autorestart=true                                        ; 允许自动重启
startretries=3                                          ; 启动重试次数
redirect_stderr=true                                    ; 将标准错误输出重定向到Supervisor日志
stdout_logfile=/path/to/your_stdout_log_file             ; 标准输出日志路径
environment=PATH="/path/to/your_virtualenv/bin"          ; 设置虚拟环境的路径

执行如下命令;

# 复制文件到指定的目录
sudo ./my_app.conf /etc/supervisor/conf.d/

读取并更新配置文件

# 读取
sudo supervisorctl reread
# 更新配置文件
sudo supervisorctl update
# 启动
sudo supervisorctl start my_app

4.2 flask 配置

  • 创建一个新的Supervisor配置文件,例如 your_flask_program.conf

  • 在配置文件中添加以下配置:

    [program:your_flask_program]
    command=/path/to/your_virtualenv/bin/gunicorn your_flask_app:app --bind 127.0.0.1:8000  ; Flask程序的启动命令
    directory=/path/to/your_flask_app                  ; Flask程序的根目录
    user=your_username                                 ; Flask程序运行的用户
    autostart=true                                     ; 设置为自动启动
    autorestart=true                                   ; 允许自动重启
    startretries=3                                     ; 启动重试次数
    redirect_stderr=true                               ; 将标准错误输出重定向到Supervisor日志
    stdout_logfile=/path/to/your_stdout_log_file        ; 标准输出日志路径
    environment=PATH="/path/to/your_virtualenv/bin"     ; 设置虚拟环境的路径
    
    • 在上述配置中,将 /path/to/your_virtualenv 替换为您的虚拟环境的路径,将 your_flask_app 替换为您的Flask应用程序的目录名称,将 your_flask_app:app 替换为您的Flask应用程序的 app 对象所在的模块和变量名。

    • 根据实际需要修改 --bind 参数以指定Gunicorn绑定的地址和端口。

    • 使用 export 命令设置虚拟环境的路径。

    • 通过 supervisorctl 命令启动Supervisor,并指定刚刚创建的配置文件:

      supervisorctl -c /path/to/your_supervisor.conf
      这样,Supervisor将在指定的虚拟环境中启动并监控Flask应用程序。
      请确保在启动Supervisor之前,虚拟环境已安装好,并存储了Flask程序所需的依赖。
      在使用Supervisor监控Flask程序时,请确保在虚拟环境中正确安装了Gunicorn,并提供了有效的启动命令和相关配置。
      
  • 方式二

    [program:my_app]
    command=/home/whj/data/envs/learn_code/bin/gunicorn -b 0.0.0.0:9000 -w 3 app:app
    directory=/home/whj/data/code/learn_code/ubuntu_code/learn
    user=whj
    autostart=true
    autorestart=true
    redirect_stderr=true
    stdout_logfile=/home/whj/data/log/my_log.log
    

    执行如下命令;

    # 复制文件到指定的目录
    sudo ./my_app.conf /etc/supervisor/conf.d/
    

    读取并更新配置文件

    # 读取
    sudo supervisorctl reread
    # 更新配置文件
    sudo supervisorctl update
    # 启动
    sudo supervisorctl start my_app
    

4.3 python脚本的监控

假设服务名称为test。启动文件为py类文件entry.py

[program:my_my]  ;指定名称
command=/home/whj/data/envs/learn_code/bin/python print_sleep.py    ; 启动路径
directory=/home/whj/data/code/learn_code/ubuntu_code/learn			; 代码路径
user=whj
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/home/whj/data/log/my_py.log  ; 指定日志输出

supervisor 未启动的时候使用如下命令启动

# 读取配置文件
sudo suppervisorctl reread
# 更新配置文件
sudo suppervisorctl update
# 服务启动
sudo supervisorctl start my_my  # 指定启动的名称,通常执行完成 update 之后服务已经会启动了,本句命令也可以用作检验使用;

4.4 docker监控

Supervisor 可以监控和管理 Docker 容器的状态,通过使用 Supervisor 的program配置项,指定Docker命令启动和停止容器。

以下是监控Docker容器状态的一般步骤:

  1. 安装Supervisor:使用适合您的系统的方法安装Supervisor。
  2. 创建Supervisor配置文件:创建Supervisor的配置文件,例如docker.conf
[program:mydockercontainer]
command=docker run --name mycontainer myimage
autostart=true
autorestart=true

在上述配置中,mydockercontainer是容器的名称,command指定了启动容器的Docker命令。

可以根据实际需要,在command中添加其他选项,如端口映射、环境变量等。

  1. 更新Supervisor配置:运行以下命令更新Supervisor的配置。
$ supervisorctl reread
$ supervisorctl update
  1. 启动Docker容器:运行以下命令启动Docker容器。
$ supervisorctl start mydockercontainer

现在,Supervisor会监控Docker容器的状态,并在需要时自动重启容器。

如果需要停止或重启Docker容器,可以使用以下命令:

$ supervisorctl stop mydockercontainer
$ supervisorctl restart mydockercontainer

通过配置Supervisor来管理和监控Docker容器,可以确保容器的稳定运行,并在崩溃或停止时自动重启。此外,Supervisor还提供了其他功能,如日志管理和进程管控等,可以进一步提高对Docker容器的监控和管理能力。

5.supervisor 开机自动启动

一般使用supervisor开机自动启动服务,路径/usr/lib/systemd/system/supervisor.service

[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
ExecStart=/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl -c /etc/supervisor/supervisord.conf $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=50s

[Install]
WantedBy=multi-user.target

使用 apt 安装的时候默认存在该文件;

# 设置开机自动启动
systemctl enable supervisor
# 检查配置是否成功
systemctl is-enabled supervisor.service

image-20230916232649337

继续努力,终成大器!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

区块链实验室(26) - 区块链期刊Blockchain: Research and Applications

Elsevier出版物“Blockchain: Research and Applications”是浙江大学编审的期刊。该期刊自2020年创刊,并出版第1卷。每年出版4期,最新期是第4卷第3期(2023年9月)。 目前没有官方的IF,Elsevier的引用因子Citescore是6.4。 虽然是新刊&#xf…

《开发实战》18 | 数据存储:NoSQL与RDBMS如何取长补短、相辅相成?

取长补短之 Redis vs MySQL 做一个简单测试,分别填充 10 万条数据到 Redis 和 MySQL 中。MySQL 中的 name字段做了索引,相当于 Redis 的 Key,data 字段为 100 字节的数据,相当于 Redis 的Value。在我的电脑上,使用 wr…

免费的视频剪辑素材,可商用。

找免费可商用的视频剪辑素材,就上这6个网站,强推,赶紧收藏! 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富,网站主要还是以设计类素材为主,高清视频素材也很多&am…

【软件测试】黑盒测试用例的四种设计方法

一、输入域测试用例设计方法 输入域测试法是一种综合考虑了等价类划分、边界值分析等方法的综合方法,针对输入域测试法中可能出现的各种情况,输入域测试法主要考虑三个方面:  (1)极端测试(ExtremalTesting),要求在输入域中选择…

汽车数字化转型:存储驱动创新未来

通过在存储领域持续不断的技术创新,西部数据正在助力汽车行业打造更加辉煌灿烂的未来。 汽车数字化转型大会上的创新存储 近日,作为智能汽车领域的行业盛宴,2023第二届汽车数字化转型大会在上海揭幕。 本届汽车数字转型大会不但聚集了全球汽车…

Python+selenium自动化生成测试报告

批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。 unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner 一、导入HTMLT…

springboot如何接入netty,实现在线统计人数?

springboot如何接入netty,实现在线统计人数? Netty 是 一个异步事件驱动的网络应用程序框架 ,用于快速开发可维护的高性能协议服务器和客户端。 Netty ​ 是一个 NIO 客户端服务器框架 ​,可以快速轻松地开发协议服务器和客户端等…

使用富斯i6遥控器设置6种飞行模式

使用富斯i6遥控器设置6种飞行模式 将富斯i6遥控器的SWC和SWD分别设置为ch5和ch6,然后使用混控功能设置6段开关,以实现6种飞行模式 一、设置辅助通道 进入系统菜单,选择 Functions Setup 选项,进入 Aux. channels 进行设置。将 Channel 5设置为 SwC,Channel 6 设置为 Sw…

CompletableFuture-CompletionStage接口源码分析和四大静态方法初讲

2.3 CompletableFuture对Future的改进 2.3.1 CompletableFuture为什么会出现 get()方法在Future计算完成之前会一直处在阻塞状态下,阻塞的方式和异步编程的设计理念相违背。 isDene()方法容易耗费cpu资源(cpu空转), 对于真正的…

SpringBoot @value注解动态刷新

参考资料 Spring系列第25篇:Value【用法、数据来源、动态刷新】【基础系列】SpringBoot配置信息之配置刷新【基础系列】SpringBoot之自定义配置源的使用姿势【基础系列】SpringBoot应用篇Value注解支持配置自动刷新能力扩展Spring Boot 中动态更新 Value 配置 一. …

完成“重大项目”引进签约,美创科技正式落户中国(南京)软件谷

近日,美创科技正式入驻中国(南京)软件谷,并受邀出席中国南京“金洽会"之“雨花台区数字经济创新发展大会”。美创科技副总裁罗亮亮作为代表,在活动现场完成“重大项目”引进签约。 作为国家重要的软件产业与信息服…

Redis之set类型

文章目录 Redis之set类型1. 添加元素/获取集合中的所有元素/获取集合中元素个数2. 删除元素3. 判断元素是否在集合中3. 从集合中随机弹出一个元素,元素不删除4. 从集合中随机弹出元素,出一个删一个5. 将元素从一个集合转移到另外一个集合6. 集合的差集7.…

周记之重新开始

对于这周的学习,我进行了深刻的反思: 先来说说每天做了什么: 9.18号:把这个顶部的个人信息画出来了;然后记了两个单词(这是能说的吗,这两个单词还是之前复习的)现在都记忆犹新&…

31.下一个排列

方法:两遍扫描 举例: 4 5 2 6 3 1排列中较小数为2,较大数为3,交换两者得:4 5 3 6 2 1,将[i1,n)区间改成升序:得下一个排列: 4 5 3 1 2 6。 若第一步找不到较小数,即当前排…

基础算法--区间合并

区间合并简介 区间合并模型是一种竞赛里比较常见的模型,他的含义是,给你n个区间,要你合并所有有交集的区间,并求出合并后剩下的区间个数,如区间[1, 4]和[2, 3]可以合并成[1, 4],但是[1, 2] 和 [3, 4] 不可…

SLAM从入门到精通(rviz的使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在ros开发当中,rviz和tf都是用的比较多的一个工具。前者是为了实现传感器数据和计算结果的可视化,后者主要是为了显示各个传…

深度学习中什么是embedding

使用One-hot 方法编码的向量会很高维也很稀疏。假设我们在做自然语言处理(NLP)中遇到了一个包含2000个词的字典,当使用One-hot编码时,每一个词会被一个包含2000个整数的向量来表示,其中1999个数字是0,如果字典再大一点&#xff0c…

华为云云耀云服务器L实例评测|华为云上安装etcd

文章目录 华为云云耀云服务器L实例评测|华为云上安装etcd一、什么是etcd官方硬件建议 二、华为云主机准备三、etcd安装1. 安装预构建的二进制文件2. 从源代码构建 四、etcd服务注册与发现1. 配置etcd2. 使用systemctl 管理启动etcd服务3. 注册服务4. 发现服务 五、其…

python+opencv神经网络风格迁移--你也可以拥有梵高一样的画作

梵高画作 什么是神经网络的风格迁移,简单来件就是输入1张照片(自己的照片),输出具备另外一张照片(例子梵高画作)风格的图片,同时保留原本自己图片的元素,如下图片表明了神经网络风格迁移的过程,当然你也可以使用自己的神经网络训练自己的模型,本期教程利用了已经训练…