Windows下数据资源公开访问之环境搭建方法(2023.1.2)

news2024/12/27 10:28:40

Windows下数据资源公开访问之环境搭建方法(2023.1.2)

  • 1、需求分析
  • 2、常用的解决方案
    • 2.0 前提环境(Java + Node)
    • 2.1 方案一:利用现有服务器容器(以Tomcat为例)
      • 2.1.1 下载Tomcat并解压
      • 2.1.2 配置系统环境变量
      • 2.1.3 修改Tomcat服务器配置文件并启动
    • 2.2 方案二:自己搭建服务器容器
      • 2.2.1 Vue
        • 2.2.2.1 Node全局安装Vue和Webpack依赖
        • 2.2.2.2 Vue项目初始化构建
        • 2.2.2.3 复制文件到static目录重启访问
      • 2.2.2 Express
        • 2.2.2.1 所需文件1(package.json)
        • 2.2.2.2 所需文件2(server.js)
        • 2.2.2.3 启动Web应用访问数据资源文件
  • 3、三种方法简单对比
  • 4、总结

1、需求分析

        Web开发者和客户在很多情况下都会从网络上下载资源文件,如安装包文件(.iso、.exe、.msi)、依赖库文件(.dll、.lib)、压缩文件(.zip、.rar、.tar.gz)、图片文件(.png、.jpg、.gif、.ico、.tif、.mat)、表格文件(.xls、.xlsl、.csv)、文本文件(.txt、.dat、.json)、代码文件(.c、.cpp、.h、.hpp、.java、.py、.m、.cs、.js、.scala、.bat、.cmd),而网络上的各类文件(本质为数据)均可称之为资源Resource,之所以能够被网友下载,是因为这些文件寄存在网络服务器上,它们被放置在服务器特定的文件夹下,通过统一资源定位符URL或统一资源索引URI来标识,以便用户进行下载,当然对于image图片或json文本或pdf文档等数据可支持浏览器在线查看。注:这里关注的仅仅是数据资源,暂不讨论模型计算资源服务资源

        有一天,开发者或者企业想要给客户分享资源,当然这里仅讨论公开的资源,这些资源需要寄宿到一个Web服务器上,这时开发者应该如何去实现呢?

2、常用的解决方案

        当然,想要解决数据资源公开访问的问题,可从以下两个方面入手:(1)开发者和工程师自己写一个服务器容器,将本地文件挂靠在其中;(2)依托现有的网络服务器,通过本地部署,将资源文件及数据安置其中。 毋庸置疑的是,这两种方式在最终呈现给用户时,都需要使用接受工信部备案的公网IP来让广大客户公开访问,有经济能力的个人或企业会购买域名,这样将域名与公网IP进行绑定,就可直接利用域名地址拼接服务器资源URL为用户提供访问和下载服务

2.0 前提环境(Java + Node)

        本文所提到的解决方案涉及Java环境和Nodejs运行时环境,对于Java环境,可安装Java 8Java 11;对于Nodejs直接安装即可,版本不要太低。Java 11+Nodejs为本文的测试环境。

Java 8 + Nodejs
Java 11 + Nodejs

2.1 方案一:利用现有服务器容器(以Tomcat为例)

        Tomcat作为强大的开源服务容器,一直以来深受广大开发者的喜爱。随着版本的不断更新,Tomcat的版本也需要与Java版本相适配。

2.1.1 下载Tomcat并解压

        到Tomcat官网下载免安装版压缩包文件,下载完成后解压,这里解压到了E:\jing_zhong\apache-tomcat-11.0.0-M1文件夹。

Tomcat 11免安装版压缩包文件下载
Tomcat 11压缩包解压至E:\jing_zhong文件夹下

2.1.2 配置系统环境变量

        点击计算机(我的电脑)>>>右键>>>属性>>>高级系统设置>>>环境变量,设置系统环境变量JAVA_HOMECATALINA_HOMECATA_LINA_BASEE:\jing_zhong\apache-tomcat-11.0.0-M1(注:Tomcat解压文件夹),在配置好上述变量后,可以利用键盘组合键Win+R打开cmd命令行窗口,通过输入如下命令来检查系统变量是否设置生效:

JDK 11安装目录
配置JAVA_HOME环境变量
配置CATALINA_HOME环境变量
配置CATALINA_BASE环境变量

        这里我选择的tomcat v11.0.0必须使用Java 11,而不能使用Java 8Win+R打开命令行窗口,依次输入命令echo %JAVA_HOME%echo %CATALINA_HOME%echo %CATALINA_BASE%来测试环境变量是否配置成功,如果成功则如下图所示:

环境变量配置成功

2.1.3 修改Tomcat服务器配置文件并启动

        在添加完系统环境变量后,还需要对Tomcat服务器的相关配置进行修改,具体内容如下:

  1. 打开conf目录下的logging.properties文件,在 java.util.logging.ConsoleHandler.encoding = UTF-8后添加以下代码可设置Tomcat服务器在控制台显示中文乱码的问题;
java.util.logging.ConsoleHandler.encoding = GBK

在这里插入图片描述

  1. 打开conf目录下的server.xml文件,找到Connector标签下的port属性,将默认端口8080改为8084;

默认端口为8080

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

修改端口为8084

<Connector port="8084" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

在这里插入图片描述

  1. 打开conf目录下的server.xml文件,向内部添加虚拟路径映射,在文件最后添加如下代码:
<Context path="/jing_zhong" docBase="E:/jing_zhong/gulp-learn/Build/Documentation" reloadable="false" ></Context>

在这里插入图片描述

  1. 打开conf目录下的web.xml文件,将listings的值由false修改为true。

在这里插入图片描述

        最后双击bin目录下的startup.bat来启动Tomcat服务器,然后打开浏览器访问资源文件地址即可。
在这里插入图片描述

要访问的资源文件
http://localhost:8084
http://localhost:8084/jing_zhong
http://localhost:8084/jing_zhong/Animation.html
http://localhost:8084/images
http://localhost:8084/images/Label.png
http://localhost:8084/jing_zhong/javascript/html5.js

2.2 方案二:自己搭建服务器容器

        这里所谓的自己搭建服务器并不意味着从底层开始写,那样工作量庞大且对技能要求较高,同时缺乏高效性和实时性,短期很难实现,因此还是借助Web应用作为服务器来放置数据资源以提供给用户进行访问,下面主要以VueExpress为例来进行介绍。

2.2.1 Vue

        作为一个优秀的前端开发框架,Vue毫无疑问受到广大开发者的一致好评,并且有着遍地开花的广泛应用。

2.2.2.1 Node全局安装Vue和Webpack依赖

        利用命令npm install --global vuenpm install --global webpack来在全局安装VueWebpack,然后Win>+R打开命令行窗口,输入以下命令来验证依赖包是否安装成功:

node -v
vue -V
webpack -v
验证Vue和Webpack是否安装成功

2.2.2.2 Vue项目初始化构建

        在VueWebpack安装成功后,同样在命令行窗口进入自己所选的文件夹,输入如下命令(含初始化项目+进入项目文件夹+启动项目)快速搭建一个以Webpack为构建的Vue项目。

vue init webpack test-Vue
cd test-Vue
npm run dev

在这里插入图片描述
在这里插入图片描述

2.2.2.3 复制文件到static目录重启访问

        用记事本打开config文件夹下的index.js,将默认端口号8080修改为8085,如下图所示:

config文件夹
修改port端口号为8085

        之后将自己想要分享的数据资源文件放置在test-Vue项目的static文件夹下,重新启动项目(npm run dev)即可访问数据文件并下载。

static文件夹
复制数据资源文件到static文件夹

在这里插入图片描述

http://localhost:8085/
http://localhost:8085/static/Documentation
http://localhost:8085/static/Documentation/Animation.html
http://localhost:8085/static/Documentation/Images/Label.png
http://localhost:8085/static/Documentation/javascript/html5.js

2.2.2 Express

        Express 可基于Node.js快速构建Web应用,十分强大的同时又不失灵活性,如果想要深入了解可参考Node.js Express 框架学习。

2.2.2.1 所需文件1(package.json)

        在E:\jing_zhong\MyServer文件夹下新建一个记事本文件,将文件重命名为package.json,将以下内容复制到package.json文件内:

{
  "name": "MyServer",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "compression": "^1.7.4",
    "express": "^4.18.2",
    "expression": "0.0.1",
    "fs": "0.0.1-security",
    "mime": "^3.0.0",
    "request": "^2.88.2",
    "url": "^0.11.0",
    "yargs": "^17.6.2"
  }
}

2.2.2.2 所需文件2(server.js)

        在E:\jing_zhong\MyServer文件夹下新建一个记事本文件,将文件重命名为server.js,将以下内容复制到server.js文件内:

"use strict";
(function () {
  const express = require("express");
  const compression = require("compression");
  const fs = require("fs");
  const url = require("url");
  const request = require("request");

  const gzipHeader = Buffer.from("1F8B08", "hex");

  const yargs = require("yargs").options({
    port: {
      default: 8084,
      description: "Port to listen on.",
    },
    public: {
      type: "boolean",
      description: "Run a public server that listens on all interfaces.",
    },
    "upstream-proxy": {
      description:
        'A standard proxy server that will be used to retrieve data.  Specify a URL including port, e.g. "http://proxy:8004".',
    },
    "bypass-upstream-proxy-hosts": {
      description:
        'A comma separated list of hosts that will bypass the specified upstream_proxy, e.g. "lanhost1,lanhost2"',
    },
    help: {
      alias: "h",
      type: "boolean",
      description: "Show this help.",
    },
  });
  const argv = yargs.argv;

  if (argv.help) {
    return yargs.showHelp();
  }
  const mime = express.static.mime;
  mime.define(
    {
      "application/json": ["czml", "json", "geojson", "topojson"],
      "application/wasm": ["wasm"],
      "image/ktx2": ["ktx2"],
      "model/gltf+json": ["gltf"],
      "model/gltf-binary": ["bgltf", "glb"],
      "application/octet-stream": [
        "b3dm",
        "pnts",
        "i3dm",
        "cmpt",
        "geom",
        "vctr",
      ],
      "text/plain": ["glsl"],
    },
    true
  );

  const app = express();
  app.use(compression());
  app.use(function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header(
      "Access-Control-Allow-Headers",
      "Origin, X-Requested-With, Content-Type, Accept"
    );
    next();
  });

  function checkGzipAndNext(req, res, next) {
    const reqUrl = url.parse(req.url, true);
    const filePath = reqUrl.pathname.substring(1);

    const readStream = fs.createReadStream(filePath, { start: 0, end: 2 });
    readStream.on("error", function (err) {
      next();
    });

    readStream.on("data", function (chunk) {
      if (chunk.equals(gzipHeader)) {
        res.header("Content-Encoding", "gzip");
      }
      next();
    });
  }

  app.use(express.static(__dirname));

  function getRemoteUrlFromParam(req) {
    let remoteUrl = req.params[0];
    if (remoteUrl) {
      // add http:// to the URL if no protocol is present
      if (!/^https?:\/\//.test(remoteUrl)) {
        remoteUrl = "http://" + remoteUrl;
      }
      remoteUrl = url.parse(remoteUrl);
      // copy query string
      remoteUrl.search = url.parse(req.url).search;
    }
    return remoteUrl;
  }

  const dontProxyHeaderRegex = /^(?:Host|Proxy-Connection|Connection|Keep-Alive|Transfer-Encoding|TE|Trailer|Proxy-Authorization|Proxy-Authenticate|Upgrade)$/i;

  function filterHeaders(req, headers) {
    const result = {};
    // filter out headers that are listed in the regex above
    Object.keys(headers).forEach(function (name) {
      if (!dontProxyHeaderRegex.test(name)) {
        result[name] = headers[name];
      }
    });
    return result;
  }

  const upstreamProxy = argv["upstream-proxy"];
  const bypassUpstreamProxyHosts = {};
  if (argv["bypass-upstream-proxy-hosts"]) {
    argv["bypass-upstream-proxy-hosts"].split(",").forEach(function (host) {
      bypassUpstreamProxyHosts[host.toLowerCase()] = true;
    });
  }

  app.get("/proxy/*", function (req, res, next) {
    let remoteUrl = getRemoteUrlFromParam(req);
    if (!remoteUrl) {
      remoteUrl = Object.keys(req.query)[0];
      if (remoteUrl) {
        remoteUrl = url.parse(remoteUrl);
      }
    }

    if (!remoteUrl) {
      return res.status(400).send("No url specified.");
    }

    if (!remoteUrl.protocol) {
      remoteUrl.protocol = "http:";
    }

    let proxy;
    if (upstreamProxy && !(remoteUrl.host in bypassUpstreamProxyHosts)) {
      proxy = upstreamProxy;
    }

    request.get(
      {
        url: url.format(remoteUrl),
        headers: filterHeaders(req, req.headers),
        encoding: null,
        proxy: proxy,
      },
      function (error, response, body) {
        let code = 500;

        if (response) {
          code = response.statusCode;
          res.header(filterHeaders(req, response.headers));
        }

        res.status(code).send(body);
      }
    );
  });

  const server = app.listen(
    argv.port,
    argv.public ? undefined : "localhost",
    function () {
      if (argv.public) {
        console.log(
          "Your server running publicly.  Connect to http://localhost:%d/",
          server.address().port
        );
      } else {
        console.log(
          "Your server running locally.  Connect to http://localhost:%d/",
          server.address().port
        );
      }
    }
  );

  server.on("error", function (e) {
    if (e.code === "EADDRINUSE") {
      console.log(
        "Error: Port %d is already in use, select a different port.",
        argv.port
      );
      console.log("Example: node server.cjs --port %d", argv.port + 1);
    } else if (e.code === "EACCES") {
      console.log(
        "Error: This process does not have permission to listen on port %d.",
        argv.port
      );
      if (argv.port < 1024) {
        console.log("Try a port number higher than 1024.");
      }
    }
    console.log(e);
    process.exit(1);
  });

  server.on("close", function () {
    console.log("Your server stopped.");
  });

  let isFirstSig = true;
  process.on("SIGINT", function () {
    if (isFirstSig) {
      console.log("Your server shutting down.");
      server.close(function () {
        process.exit(0);
      });
      isFirstSig = false;
    } else {
      console.log("Your server force kill.");
      process.exit(1);
    }
  });
})();

2.2.2.3 启动Web应用访问数据资源文件

        将数据资源文件文件夹拷贝到MyServer文件夹下,然后Win>+R打开命令行窗口,依次输入如下命令来启动Web应用,即可成功访问数据资源。

数据资源拷贝到MyServer文件夹下
npm install
node server.js --port 8086
安装依赖并启动MyServer
http://localhost:8086/
http://localhost:8086/package.json
http://localhost:8086/Documentation/Animation.html
http://localhost:8086/Documentation/Images/Label.png
http://localhost:8086/Documentation/javascript/html5.js
http://localhost:8086/Server.js

3、三种方法简单对比

        通过对比Tomcat、Vue、Express这三种访问公开数据资源的搭建方法,得出如下表所示的结论。

表1 三种方法在不同维度下的对比结果
维度\方法TomcatVueExpress
搭建方法Tomcat无疑更加灵活,能够进行本地文件夹的虚拟地址映射,在映射完成后可以在浏览器中公开访问文件夹及其中的文件能访问文件,不能访问文件夹,需要提供准确的数据资源地址,尽管可以配置代理Proxy来进行虚拟地址映射,但过程较为繁琐能访问文件,不能访问文件夹,需要提供准确的数据资源地址,尽管可以配置代理Proxy来进行虚拟地址映射,但过程较为繁琐
访问自由度Tomcat方式则需要配置环境变量,修改相关配置文件,无需手动复制或移动文件夹和数据资源Vue方式需要安装一些可选的依赖包,初始化速度不如Express快,但时间也较短,需要移动数据资源到项目目录下,改变需要重启;Express方式十分轻便高效,可以在较短时间内搭建完成,需要移动数据资源到项目目录下,但改变无需重启
并发稳定性当用户并发数增多,Tomcat相对于Vue和Express来说更加稳定,能够设置并发数量,具有不错的扛并发访问能力,可配置在内网和公网供几百个用户访问Web应用一般为开发环境,尽管可以部署,但很难支持强大的用户并发访问数量,建议在局域网或内网供小规模的开发团队或少的用户来使用Web应用一般为开发环境,尽管可以部署,但很难支持强大的用户并发访问数量,建议在局域网或内网供小规模的开发团队或少的用户来使用

4、总结

        最后,浅谈一下我个人的实际体验,当然不一定对哦!!!🌈🌈🌈本人比较喜欢Tomcat方式,因为可配置多个Tomcat,每个Tomcat下可进行多个数据资源的虚拟地址映射,以供用户访问下载,比较稳定,适合大规模多用户高并发的访问场景;当然VueExpress这两种方式对于临时的文件资源共享也十分方便,适合API及文档共享、团队代码开发协作、小用户量的数据资源下载等场景。从实际应用来讲,各种框架和开源服务器软件很多,但需要自己亲自尝试来对比效果和性能,目前我觉得还是得先明确自己的实际需求,分析关注的维度指标,因时因地制宜,选择适合业务应用的环境搭建方法

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

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

相关文章

数据结构-考研难点代码突破(C++实现有向图最短路径算法(Dijkstra,Floyd-Warshall算法)图解操作细节(引自C语言中文网))

以代码的方式复习考研数据结构知识点&#xff0c;这里在考研不以代码为重点&#xff0c;而是以实现过程为重点 文章目录1. 最短路径2. 单源最短路径ⅠDijkstra算法C代码3. 多源最短路径Ⅰ Floyd-Warshall算法C代码1. 最短路径 图的生成树针对的是无向图&#xff0c;图的最短路…

error ‘for’ loop initial declarations are only allowed in C99 mode的报错原因和两种解决办法

error: ‘for’ loop initial declarations are only allowed in C99 mode的报错原因和两种解决办法 for(int i0;i<5;i) { … } 错误&#xff1a;使用gcc编译代码报错 &#xff1a;error: ‘for’ loop initial declarations are only allowed in C99 mode note: use …

Spark02: Spark三种任务提交方式

1. 直接在IDEA中执行&#xff0c;方便在本地环境调试代码 2. 使用spark-submit提交到集群执行【实际工作中使用】 3. 使用spark-shell&#xff0c;方便在集群环境调试代码 比如&#xff1a;需要连接数据库&#xff0c;无法在本地调试的情况。 spark-shell 实现了用户可以逐…

流程控制之for循环练习

目录练习案例1. for创建20用户2. for ping测试指网段的主机3. 使用for实现批量主机root密码的修改练习案例 1. for创建20用户 用户前缀由用户输入 用户初始密码由用户输入 例如&#xff1a;test01,test10 #!/bin/bash ######################### #File name:userCreate.sh #…

[学习笔记]2021韩顺平一周学会Linux

文章目录视频链接&#xff1a;第1章&#xff1a;Linux开山篇-内容介绍1.1 本套Linux课程内容1.2 Linux使用的地方1.3 Linux应用的领域第2章&#xff1a;Linux基础篇-Linux入门&#xff1a;2.1 Linux介绍2.1.1概述2.2 Linux和Unix的关系2.2.1 Unix是怎么来的2.2.2 Linux是怎么来…

【阶段一】Python快速入门06篇:正则表达式-re 模块

本篇的思维导图: 正则表达式-re 模块 正则表达式(Regular Expression)是一种文本模式的描述方法。例如,\d是一个正则表达式,表示一位数字字符,即任何一位0到9的数字。 在 Python 语言中re 模块提供了全部的正则表达式函数,例如:compile 函数。 compile 函数 compile 函…

Qt CSV文件的创建,读写操作

文章目录一.CSV文件介绍二.创建CSV文件三.写入CSV文件四.读取CSV文件一.CSV文件介绍 逗号分隔值&#xff08;Comma-Separated Values&#xff0c;CSV&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表…

基于ASP.NET MVC的运动用品网上销售系统

摘要 随着现代都市生活节奏的不断加快、网络覆盖面的日益扩大&#xff0c;越来越多的人们加入了网上购物的行列。如今&#xff0c;网购已经成为人们生活的一部分。本系统主要是使用 B/S架构开发出的一个基于ASP.NET的运动用品网上销售系统。前台页面使用htmljscss&#xff0c;S…

Freemarker指令语法

基础语法种类 1、注释&#xff0c;即<#-- -->&#xff0c;介于其之间的内容会被freemarker忽略 <#--我是一个freemarker注释-->2、插值&#xff08;Interpolation&#xff09;&#xff1a;即..部分,freemarker会用真实的值代替{..}部分,freemarker会用真实的值代…

十一、中间件的使用

Express的应用本质上就是调用各种中间件&#xff0c;中间件指的是业务流程中的中间处理环节&#xff0c;服务器的生命周期一般是 接收 —— 处理 —— 响应&#xff1b;那么中间件就充当处理的角色&#xff0c;它其实就是一个函数&#xff0c;该函数除了能够访问请求对象req和响…

TC275——02板卡简单介绍

前部 核心&#xff1a;英飞凌 32位 AURIXTC275 TriCore核 开发工具&#xff1a; AURIX™Development Studio、FreeEntryToolchain CPU&#xff1a; 最大频率&#xff1a;200M外部晶振&#xff1a;20MFPU&#xff1a;支持封装&#xff1a;LQFP176-22 FLASH&#xff1a;4M D…

高并发系统设计 -- 性能测试

响应时间&#xff1a;是客户发出请求到得到响应的整个过程的时间。 网络传输时间&#xff1a;N1N2N3N4应用服务器处理时间&#xff1a;A1A3数据库服务器处理时间&#xff1a;A2响应时间&#xff1a;N1A1N2A2N3A3N4 负载&#xff1a;模拟业务操作对服务器造成压力的过程&#x…

shell-函数与数组

1.编写函数&#xff0c;实现打印绿色OK和红色FAILED 判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED [rootcotenos day06]# vim colour.sh #!/bin/bash test(){if [ -z $1 ];thenecho -e "\033[31m FAILED \033[0m"elseecho -e "\033[32m …

git tutorial

最近老板要搞retreat 需要做一个分享&#xff0c;正好把分享的内容作为博客记录一下。 说起git&#xff0c;那就不得不提GitHub。 GitHub 最开始是作为一个面向开源以及私有项目的管理平台。它可以存储代码&#xff0c;文档&#xff0c;数据等等。目前最常用将其作为一个代码…

中点分割裁剪算法介绍 (简单易懂)

目录 一、算法介绍 二、算法描述 一、算法介绍 裁剪效果图&#xff1a; 中点分割裁剪算法的思想类似于二分思想&#xff0c;不断地在中点处将线段一分为二&#xff0c;对每段线段重复Cohen-Sutherland裁剪算法的线段可见性测试方法&#xff0c;直至找到每段线段与窗口边界线的…

STM32MP157驱动开发——Linux块设备驱动

STM32MP157驱动开发——Linux块设备驱动一、简介二、驱动开发1.使用请求队列的方式2.测试①3.不使用请求队列的方式4.测试②参考文章&#xff1a;【正点原子】I.MX6U嵌入式Linux驱动开发——Linux 块设备驱动 一、简介 之前学习的都是关于字符设备的驱动&#xff0c;包括 plat…

Node.js下载安装与基础操作

&#x1f973;博 主&#xff1a;初映CY的前说 &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;Node.js的下载安装操作 node.js下载安装 node.js中文网下载链接http://nodejs.cn/download/ 1.浏…

模型性能分析:ROC 分析和 AUC

本文[1]将介绍模型性能分析的两个方法&#xff1a;ROC & AUC。 ROC 分析和曲线下面积 (AUC) 是数据科学中广泛使用的工具&#xff0c;借鉴了信号处理&#xff0c;用于评估不同参数化下模型的质量&#xff0c;或比较两个或多个模型的性能。 传统的性能指标&#xff0c;如准确…

什么是进程、线程,什么是并发、并行及线程的创建和线程的基本使用

一、什么是程序、进程、线程 1、什么是程序 程序可以理解为是我们执行的一段代码&#xff0c;是一种静态的概念 2、什么是进程 进程是指运行中的程序&#xff0c;是一个动态的概念。进程有它自身的产生、存在和消亡的过程&#xff08;进程产生就会占用内存空间&#xff0c;反…

【WSL】[04]从C盘解放出来WSL的linux镜像

前言&#xff1a; C盘的硬盘资源有限&#xff0c;虚拟机的需求无限&#xff0c;所以&#xff0c;要把无限的硬盘需求搞到其他盘去才行啊 方案1&#xff1a;利用工具&#xff1a;move-wsl 1 管理员运行PowerShell,创建WSL的工作目录 移动前&#xff0c;C盘的空间大小&#xf…