Django+Nginx+uWSGI+Supervisor实战

news2024/11/24 18:31:21

大家好,真的是许久没有更新文章了,甚是想念,最近这段时间事情很多,家里的事情、工作的事情,真没有太多时间去码文章,其实已经搁置了些许文章,没有整理,趁着这段时间风平浪静,我还是不忘初心,给大家分享。

唠嗑下网络自动化(NetDevOps):

为什么要讨论这个,其实这段时间我也在求职摸索和对未来职业的思考,在我的粉丝里绝大多数都是网络工程师,主要还是以网工为主,专职网络自动化的极少,咋最多就当个工具来使用。

家事:

  • 我是2个孩子的奶爸,早上送娃幼儿园、买菜,中午下班还得炖个汤/做个菜,下午接娃,晚上还得做饭,带娃睡觉。不知不觉已经3年多了,这是我日常的一部分。

  • 学习的时间很少,我凌晨才开始码代码,这几年基本精力全部投入学习开发,也许是兴趣驱动着,让我坚持,但忽略了本职技术。

    少走一些坑:

  • 我也是一名网络工程师,双IE,华为IE号是4位数(吹下水),python是我的辅助工具。

  • 求职路上,发现外面网络自动化岗位(NetDevOps)极少(可以说没有),大家要看看外面的市场,可在招聘平台搜索看看。

  • 着重以网工技术/管理为主,千万别陷入网络开发太深,别去深入学习前端框架、深入学习后端django,不要走偏路线(除专职网络自动化方向);
    因为学习前端成本太高、费时费精力,容易忽略本职技术方向,后端开发同理。如果你是学霸,请忽略。

  • 了解专职网络开发的公司:字节、腾讯、XX银行、唯品、科大讯飞等等,都是专职开发的,很少网络和开发兼并的(专业的事专业的人做)。

  • 当前以云计算、SDN网络、SegmentRouting(SR)、SRv6、IB网络及TCP/IP详解等技术学习方向,开发为辅

  • 善用chatGPT,多途径使用AI工具;

有兴趣可以学学开发,但别当真,想想未来市场需要啥,你想要做啥?

时间是宝贵的,把时间花在刀刃上。

好了,就先唠嗑到这,接下来就把下面这篇文章分享给有需求的小伙伴们。

简介

什么是Django?

Django是一个基于Python语言开发的Web框架。它提供了一种高效的方式来设计、开发和部署Web应用程序,使得开发者可以更加专注于业务逻辑的实现而不是底层技术的实现。Django框架提供了很多强大的功能,如ORM(对象关系映射)、模板系统、表单处理等,这些功能可以帮助开发人员更加高效地开发Web应用程序。还有其他开源的web框架如Flask。

什么是Nginx?

Nginx是一个Web服务器,也可以作为反向代理、负载均衡器和HTTP缓存使用。它以高性能、稳定性和低资源消耗著称。Nginx通常用于通过直接提供静态内容和将动态内容传递给应用程序服务器(如uWSGI)来改善Web应用程序的性能和可靠性。

这里可能有人会问了,django的runserver启动后不是可以访问的嘛?还需要nginx做啥?这种在生产环境下是不推荐的,而且并发的效率低,仅在开发环境下使用。

什么是uWSGI?

Web Server Gateway Interface,Web服务器网关接口

Client(用户)<=>Nginx(Web服务器)<=>uWSGI<=>Django-APP(应用)

WSGI是一种Web服务器网关接口,用于在Web服务器和Web应用程序之间进行通信。uWSGI是一个用于Web服务器和Web应用程序之间进行通信的协议。在使用uWSGI时,Web服务器通过uwsgi协议向uWSGI服务器发送请求,然后uWSGI服务器将请求转发到Web应用程序中,最终,Web应用程序将响应发送回uWSGI服务器,然后再将其发送回Web服务器。因此,可以说uWSGI是一个用于将Web服务器和Web应用程序连接起来的软件(中间的桥梁)。

  • Nginx:是面向用户
  • uWSGI:Web服务器
  • WSGI:Web服务器与Web应用通信的规范
  • uwsgi:是WSGI通信规范的一种自有协议
  • uWSGI是中间角色,桥接Nginx和APP

nginx-uWsgi

什么是Supervisord?

Supervisor是一个用Python编写的进程控制系统。它可以在后台运行和监控多个进程(如ngnix/uwsgi/celery等),并在它们出现故障时重新启动它们。Supervisor还可以提供Web界面访问(默认关闭),方便查看和管理的进程。

温馨提示:supervisord不支持windows环境,supervisor-win可以支持windows环境。

Supervisord官方介绍

如何部署?

Django部署

详细的安装部署参考之前的文章,这里简单罗列以下。

  • 安装

    # 以版本3.2为安装示例
    $ python -m pip install django==3.2
    
  • 新建项目

    $ python manage.py startproject <your-project-name>
    
  • 新建应用APP

    $ python manage.py startapp <your-app-name>		
    
  • 测试启动server

    $ python manage.py runserver 0.0.0.0:8080
    

    如果刚开始部署,能看到小火箭就是正常启动的,后面的路由、页面、样式等等,你自己巴拉巴拉搞好。

  • 关键的uWSGI配置

    先创建文件uwsgi.ini,放在settings同级目录下,配置如下所示。

    先给下项目的基本的目录,方便看:

    (py389) [netdevops@NetDevOps]$ pwd
    /home/netdevops/django/NetDevOps
    # 主要列下settings同级目录的信息
    (py389) [netdevops@NetDevOps]$tree NetDevOps
    NetDevOps/
    ├── asgi.py
    ├── celery.py
    ├── __init__.py
    ├── NetDevOps.sock  # 自动创建
    ├── routing.py
    ├── settings.py
    ├── urls.py
    ├── uwsgi.ini # 我放在settings同级目录下
    └── wsgi.py
    

    uwsgi.ini的配置

    # 创建文件
    $ touch uwsgi.ini 
    $ cat uwsgi.ini 
    [uwsgi]
    # 使用unix socket与nginx通信,仅限于uwsgi和nginx在同一主机上情形
    # Nginx配置中uwsgi_pass应指向同一socket文件
    # socket表示接收的是uwsgi协议
    socket=/home/netdevops/django/NetDevOps/NetDevOps/NetDevOps.sock
    
    # 设置项目虚拟环境,Docker部署时不需要
    home=/home/netdevops/django/NetDevOps
    # 项目的绝对路径
    chdir=/home/netdevops/django/NetDevOps
    # wsgi文件位置
    module=NetDevOps.wsgi:application
    
    # wsgi的文件,相对路径
    wsgi-file=NetDevOps/wsgi.py
    
    # python虚拟环境
    virtualenv=/home/netdevops/.pyenv/versions/py389
    
    # socket权限设置
    chmod-socket=664
    #配置启动的进程数,这个多配无意,按照自己电脑核去配置
    processes=4
    #配置每个进程的线程数
    threads=2
    #开启主进程管理模式
    master=True
    
    #配置存放主进程的进程号文件,启动uwsgi后**uwsgi.pid文件会自动生成**
    pidfile=uwsgi.pid
    #后台启动,指定日志文件位置,如使用supervisor管理uwsgi,必须禁用
    #daemonize=uwsgi.log
    #服务停止时自动移除unix Socket和pid文件
    vacuum=True
    

Nginx部署

  • yum方式安装nginx

    # 安装
    [netdevops@NetDevOps ~]$ yum install nginx
    
    # 查看版本
    [netdevops@NetDevOps ~]$ nginx -v
    nginx version: nginx/1.20.1
    
  • 进入nginx程序目录,测试nginx

    [netdevops@NetDevOps ~]$ cd /usr/sbin/
    [root@NetDevOps sbin]# ./nginx -t
    # 显示下面两行则代表可正常运行
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
  • 配置nginx

    nginx的配置参考大江狗的文章,按需调整。

    $ cat /etc/nginx/nginx.conf
    ########################## Global Start ##########################
    # 设置用户
    user netdevops;
    # 进程数,一般设成CPU核数1-2倍
    worker_processes auto;
    # 错误日志文件
    error_log /var/log/nginx/error.log;
    # 存放进程ID文件
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    ########################## Global End ##########################
    
    ########################## Event Start ##########################
    
    events {
        # 使用epoll的I/O 模型处理轮询事件
        # use epoll
        # 工作进程的最大连接数量,默认1024个
        worker_connections 1024;
        # http层面的keep-alive超时时间
        # keepalive_timeout 60;
        # 客户端请求头部的缓冲区大小
        # client_header_buffer_size 2k;
    }
    
    ########################## Event End ##########################
    
    
    ########################## HTTP Start ##########################
    http {
        # 日志格式
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        # access日志路径
        access_log  /var/log/nginx/access.log  main;
        # 允许sendfile方式传输文件,默认为off。
        sendfile            on;
        # sendfile开启时才开启。
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 4096;
    
        #  导入文件扩展名与文件类型映射表
        include             /etc/nginx/mime.types;
        # 默认文件类型
        default_type        application/octet-stream;
    
        include /etc/nginx/conf.d/*.conf;
    
        # 开启gzip压缩功能
        gzip on;
        # 设置允许压缩的页面最小字节数; 这里表示如果文件小于10k,压缩没有意义.
        gzip_min_length 10k; 
        # 设置压缩比率,最小为1,处理速度快,传输速度慢
        # 9为最大压缩比,处理速度慢,传输速度快; 推荐6
        gzip_comp_level 6; 
        # 设置压缩缓冲区大小,此处设置为16个8K内存作为压缩结果缓冲
        gzip_buffers 16 8k; 
        # 设置哪些文件需要压缩,一般文本,css和js建议压缩。图片视需要压缩
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
    
           # 反向代理
        server {
            listen       80;
            listen       [::]:80;
            server_name  localhost;
            root         /usr/share/nginx/html;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
        # 网站静态文件所在目录
        location /static{
            alias /home/netdevops/django/NetDevOps/static;
    	# 静态文件缓存,10天有效
    	expires 10d;
        }
    
        # 上传文件所在目录
        location /media{
            alias /home/netdevops/django/NetDevOps/media;
        }
    
        # 动态文件交给uwsgi处理
        location / {
            uwsgi_pass  unix:/home/netdevops/django/NetDevOps/NetDevOps/NetDevOps.sock;
            include /etc/nginx/uwsgi_params;
    
    	# 允许内网所有用户访问,按需填写
    	allow 10.0.0.0/8;
    	# 拒绝所有
    	deny all;
            
        }
    
            location = /favicon.ico {
    	  log_not_found off; 
    	# 不在access_log记录该项访问
    	  access_log off;
                  }
    
            error_page 404 /404.html;
            location = /404.html {
            }
    
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
            }
        }
    }
    ########################## HTTP End ##########################
    

说明:我这里的环境只有HTTP,没有HTTPS。

Supervisor部署:

首先,先简单介绍下Supervisor的四大组成部分:

  • supervisord:Supervisor的主进程,它负责启动和停止子进程,并监控它们的状态,如果有子进程异常退出,supervisord会自动重新启动它,记录子进程stdoutstderr输出。
  • supervisorctl:Supervisor的命令行界面,启动、停止、重启子进程,查看进程状态和日志等。
  • Web界面:Supervisor提供了一个Web界面,通过Web浏览器查看和管理进程。Web界面提供了与supervisorctl相同的功能,但在Web浏览器中更加直观和易于使用(默认不启用)。
  • xml-rpc 接口:提供xml-rpc接口,用于询问和控制管理程序及其他运行的程序。

安装

# pip安装supervisord
$ python -m pip install supervisor
# 查看安装路径
$ which supervisord
/usr/local/bin/supervisord

创建目录及文件

 # 创建目录,用于存放子程序文件 xxxx.ini
 # 示例:nginx.ini、uwsgi.ini、celery.ini
$ mkdir -p /etc/supervisord.d/
$ mkdir -p /etc/supervisord.d/logs/uwsgi
$ mkdir -p /etc/supervisord.d/logs/nginx
$ cd /etc/supervisord.d/
$ touch nginx.ini
$ touch uwsgi.ini
$ ll /etc/supervisord.d/
-rw-r--r-- 1 root root 0 Aug 20 15:52 nginx.ini
-rw-r--r-- 1 root root 0 Aug 20 15:53 uwsgi.ini

生成配置文件

 # 直接执行,可以查看配置
 $ echo_supervisord_conf
  
 # 生成supervisord.conf文件,以该文件来启动
 $ echo_supervisord_conf > /etc/supervisord.conf

修改配置文件

每个子进程以子进程.ini文件存在/etc/supervisord.d/目录下,方便区分管理

$ vim /etc/supervisord.conf
# 修改成以下内容
[unix_http_server]
chmod=0777  # 允许非root运行

[include]
files = /etc/supervisord.d/*.ini

添加uwsgi的进程

$ vim /etc/supervisord.d/uwsgi.ini
# 添加的程序
[program:uwsgi]
# 所在目录
directory=/home/netdevops/django/NetDevOps/NetDevOps
# 启动uwsgi的执行命令
command=/home/netdevops/.pyenv/versions/py389/bin/uwsgi --ini /home/netdevops/django/NetDevOps/NetDevOps/uwsgi.ini
# 优先级
priority=10
# 进程名称
process_name=%(program_name)s
# 日志级别,默认info
loglevel = info
# 把stderr输入到stdout文件上
redirect_stderr=true
# stdout输出的文件路径
stdout_logfile=/etc/supervisord.d/logs/uwsgi/uwsgi.log
# 每文件最大100MB,默认50MB
stdout_logfile_maxbytes=100MB
# 文件存10份
stdout_logfile_backups=10
# 每文件最大100MB,超出存到新文件
stdout_capture_maxbytes=100MB
# stderr输出的文件路径
stderr_logfile=/etc/supervisord.d/logs/uwsgi/uwsgi_error.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=100MB

其他参数:

  • autostart:默认true,supervisor启动,子进程启动。
  • startsecs:默认1s,子进程成功启动后需要保持运行的时间。
  • autorestart:默认 unexpected,子程序退出自动重启。
  • startretries:默认3次,允许失败重启的次数。
  • priority:默认999,值小的优先启动。
  • redirect_stderr:默认false,如设置true表示把stderr输入到stdout文件上。
  • logfile_backups:备份份数,默认10份;
  • loglevel:日志级别有critical, error, warn, info, debug, trace, or blather,默认是info
  • pidfile:进程文件,$CWD/supervisord.pid

添加nginx的进程

$ vim /etc/supervisord.d/nginx.ini 
[program:nginx]
# 所在目录
directory=/usr/sbin
# 以前台方式运行
command=/usr/sbin/nginx -g 'daemon off;'
# 优先级
priority=20
# 进程名称
process_name=%(program_name)s
# 用户
user=root
# 日志级别,默认info
loglevel = info
# 把stderr输入到stdout文件上
redirect_stderr=true
# stdout输出的文件路径
stdout_logfile=/etc/supervisord.d/logs/nginx/nginx.log
# 每文件最大100MB,默认50MB
stdout_logfile_maxbytes=100MB
# 文件存10份
stdout_logfile_backups=10
# 每文件最大100MB,超出存到新文件
stdout_capture_maxbytes=100MB
# stderr输出的文件路径
stderr_logfile=/etc/supervisord.d/logs/nginx/nginx_error.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=100MB

临时启动supervisor

先临时启动看下能否管理nginx和uwsgi两个进程,正常后在关闭

# 启动
$ supervisord -c /etc/supervisord.conf

# 关闭
 supervisorctl stop all

查看与操作进程

平时主要使用到如下几个操作命令即可。

  • 查看状态

    $ supervisorctl  status
    uwsgi                            RUNNING   pid 19835, uptime 1 day, 0:09:14
    
  • 重启所有进程

    # 重启所有的子进程
    $ supervisorctl  reload
    $ supervisorctl  status
    celery                           RUNNING   pid 122784, uptime 0:00:37
    celery_beat                      RUNNING   pid 122785, uptime 0:00:37
    uwsgi                            RUNNING   pid 122786, uptime 0:00:37
    # 我这里有3个子进程,看uptime时间都是启动不久的
    
  • 暂停与启动

    # 暂停某个进程
    $ supervisorctl  stop uwsgi
    # 启动某个进程
    $ supervisorctl  start uwsgi
    # 查看某个进程状态
    $ supervisorctl  status uwsgi
    # 暂停所有进程
    $ supervisorctl  stop all
    # 启动所有进程
    $ supervisorctl  start all
    # 重新启动所有进程
    $ supervisorctl  reload
    
  • 重新加载配置

    # 重新加载配置
    $ supervisorctl  update
    

开机启动

这里就通过systemctl方式来启动supervisord,主机关机重启也会自动激活supervisord。

  • 创建supervisord.service文件

    $ cat /etc/systemd/system/supervisord.service 
    [Unit]
    Description=Supervisor process control system for UNIX
    
    [Service]
    Type=forking
    ExecStart=/usr/local/bin/supervisord -c /etc/supervisord.conf
    ExecStop=/usr/local/bin/supervisorctl shutdown
    ExecReload=/usr/bin/supervisorctl reload
    KillMode=process
    
    [Install]
    WantedBy=multi-user.target
    
  • 开启启动

    # 开机启动
    $ systemctl  enable supervisord
    
    # 启动supervisord
    $ sudo systemctl  start supervisord
    $ sudo systemctl  status supervisord
    ● supervisord.service - Supervisor process control system for UNIX
       Loaded: loaded (/etc/systemd/system/supervisord.service; enabled; vendor preset: disabled)
       Active: active (running) since Sun 2023-08-20 23:38:41 CST; 23s ago
    ...省略...
    
    # 停止supervisord
    $ sudo systemctl  stop supervisord
    
  • 最后验证下supervisorctl的状态

    $ supervisorctl  status
    celery                           RUNNING   pid 2298, uptime 0:01:01
    celery_beat                      RUNNING   pid 2299, uptime 0:01:01
    nginx                            RUNNING   pid 2300, uptime 0:01:01
    uwsgi                            RUNNING   pid 2301, uptime 0:01:01
    

    温馨提示::主要观察下状态是不是一直保持RUNNING状态,否则需要查看下log的异常问题。

最后,就晒一张效果图吧!!!正常启动.

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

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

相关文章

MSOS604A是德科技keysight MSOS604A示波器

181/2461/8938Infiniium S系列示波器融合了创新技术&#xff0c;旨在提供卓越的测量。新的10位ADC和低噪声前端技术协同工作&#xff0c;提供高达8 GHz的性能和业界最佳的信号完整性。一个高级框架&#xff0c;配有可快速启动的固态硬盘、可轻松触摸的15英寸电容式显示屏和可快…

洛谷P8814:解密 ← CSP-J 2022 复赛第2题

【题目来源】https://www.luogu.com.cn/problem/P8814https://www.acwing.com/problem/content/4732/【题目描述】 给定一个正整数 k&#xff0c;有 k 次询问&#xff0c;每次给定三个正整数 ni&#xff0c;ei&#xff0c;di&#xff0c;求两个正整数 pi&#xff0c;qi&#xf…

取消合并单元格并快速填充

例如&#xff1a; 步骤如下&#xff1a; 1/ 取消合并单元格 2/ 全选表格 3/ excel导航栏 - 开始 - 查找和选择- 定位条件 快捷键&#xff1a;ctrlG 4/ 选择“空值” - 点击确定 5/ 输入公式 “a2" 注意&#xff0c;自定定位在a3单元格 输入完公式后&#xff0c;按…

file-storage-sdk项目开发中的踩坑记录

文章目录 file-storage-sdk项目开发中的踩坑记录问题1&#xff1a;项目启动报错&#xff1a;Attribute "click" appears more than once in element问题2&#xff1a;前端对话框被遮挡问题3&#xff1a;RequestBody无法接收表单数据问题4&#xff1a;文件上传失败问题…

WebServer 解析HTTP 响应报文

一、基础API部分&#xff0c;介绍stat、mmap、iovec、writev、va_list 1.1 stat​ 作用&#xff1a;获取文件信息 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>// 获取文件属性&#xff0c;存储在statbuf中 int stat(const char *…

Excel必备!6种快速插入√或x标记的方法揭秘

本教程展示了在Excel中插入勾或叉的六种不同方法。Excel中有两种复选标记——交互式复选框和勾号符号。 勾选框,也称为复选框或复选标记框,是一种特殊控件,允许你通过鼠标单击来选择或取消选择某个选项,即选中或取消选中勾选框。​ 勾号符号,也称为复选符号或复选标记,…

小程序排名优化全攻略

随着小程序的快速发展,小程序之间的竞争也日益激烈。如何在竞争对手众多的环境下脱颖而出,通过小程序排名优化来提高曝光率和流量转化率,已成为许多小程序开发者和运营者关注的重点。本文将全面解析小程序排名优化的方法,让您可以更好地提升小程序的搜索排名。 【名即微】 小程…

开目软件携手纷享销客共建CRM平台,数智推动规模化发展

在制造业升级转型、工业化与信息化深度融合的浪潮下&#xff0c;一批提供制造业数字化赋能的工业软件服务商趁势发力&#xff0c;迎来广阔发展空间。 武汉开目信息技术股份有限公司&#xff08;以下简称“开目软件”&#xff09;是中国高端工业软件领导品牌&#xff0c;凭借自…

Hadoop生态圈中的Hive数据仓库技术

Hadoop生态圈中的Hive数据仓库技术 一、Hive数据仓库的基本概念二、Hive的架构组成三、Hive和数据库的区别四、Hive的安装部署五、Hive的基本使用六、Hive的元数据库的配置问题七、Hive的相关配置项八、Hive的基本使用方式1、Hive的命令行客户端的使用2、使用hiveserver2方法操…

如何预防最新的Mallox变种malloxx勒索病毒感染您的计算机?

导言&#xff1a; 在数字时代&#xff0c; .malloxx 勒索病毒的威胁一直悬在我们头上&#xff0c;如何应对这种威胁&#xff0c;以及在数据被勒索后如何恢复它们&#xff0c;都是备受关注的话题。本文91数据恢复将向您介绍 .malloxx 勒索病毒的独特工作方式&#xff0c;提供与众…

APP启动优化Android篇

背景 为什么重提启动优化&#xff1f;首先&#xff0c;用户进入APP唯一的路径就是启动&#xff0c;这是体验核心链路的第一环。启动分为冷启动、热启动和温启动&#xff0c;本文中「启动」一词如果没有特别说明&#xff0c;均为冷启动。启动时间过长&#xff0c;会造成用户流失…

l8-d10 TCP协议是如何实现可靠传输的

一、TCP主要特点 TCP 是面向连接的运输层协议&#xff0c;在无连接的、不可靠的 IP 网络服务基础之上提供可靠交付的服务。为此&#xff0c;在 IP 的数据报服务基础之上&#xff0c;增加了保证可靠性的一系列措施。 TCP主要特点 1.TCP 是面向连接的运输层协议。 每一条 TCP 连…

【侯捷】C++面向对象 (上)

1.C 编程简介 & 目标 培养代码正规编范class 分为 带pointer 和 不带pointer的 学习C &#xff1a; 语言 标准库 2.C vs C C语言 &#xff1a; &#xff08;type&#xff09;数据 函数 —create—》 数据sC &#xff1a; (class ) 数据 成员 —create—》 对象不带指…

【山河送书第十期】:《Python 自动化办公应用大全》参与活动,送书两本!!

【山河送书第十期】&#xff1a;《Python 自动化办公应用大全》参与活动&#xff0c;送书两本&#xff01;&#xff01; 前言一书籍亮点二作者简介三内容简介四购买链接五参与方式六往期赠书回顾 前言 在过去的 5 年里&#xff0c;Python 已经 3 次获得 TIOBE 指数年度大奖&am…

FL Studio 21.1.0官方中文破解版下载安装激活教程重磅发布含注册机

今天带来的是FL Studio 21中文版&#xff0c;内置破解补丁&#xff0c;可以完美激活程序。所有功能均可在线编辑&#xff0c;用户可直接操作。同时&#xff0c;因为FL Studio 21是最新版本&#xff0c;所以增加了新的功能。共有八种乐器和效果器插件&#xff0c;包括效果链、音…

文心一言 VS 讯飞星火 VS chatgpt (89)-- 算法导论8.3 2题

二、用go语言&#xff0c;下面的排序算法中哪些是稳定的&#xff1a;插入排序、归并排序、堆排序和快速排序?给出一个能使任何排序算法都稳定的方法。你所给出的方法带来的额外时间和空间开销是多少&#xff1f; 文心一言&#xff1a; 在Go语言中&#xff0c;以下排序算法是…

mybatis逆向工程的构建及其概念

概念 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的。 逆向工程&#xff1a;先创建数据库表&#xff0c;由框架负责根据数据库表&#xff0c;反向生成如下资源&#xff1a; Java实体类 Mapper接口 Mapper配…

深度学习基础之梯度下降

1. 引言 梯度下降是一种用于最小化&#xff08;或最大化&#xff09;损失函数的优化算法。它是机器学习和深度学习中的一个关键概念&#xff0c;通常用于调整学习算法中的参数。 梯度下降背后的核心思想是迭代调整参数以最小化损失函数。它的工作原理是计算损失函数相对于每个…

解密外贸邮箱:揭秘其优势与出奇招!

外贸业务需要面对来自全球范围内的客户和供应商&#xff0c;因此&#xff0c;拥有一个高效可靠的通讯工具非常重要。在这方面&#xff0c;外贸邮箱无疑成为了外贸业务中不可或缺的一部分。那么&#xff0c;外贸邮箱有哪些优势呢&#xff1f;在这篇文章中&#xff0c;我们将会全…