当前位置: 首页 > news >正文

探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码

一、NIO简介

Java NIO(New IO)是Java SE 1.4引入的一个新的IO API,它提供了比传统IO更高效、更灵活的IO操作。与传统IO相比,Java NIO的优势在于它支持非阻塞IO和选择器(Selector)等特性,能够更好地支持高并发、高吞吐量的应用场景。

上图是官方对NIO的说明,Java NIO 官方通常被称为 New I/O(新I/O),但它也因其核心功能非阻塞 I/O 特性而常常被称为 Non-blocking I/O(非阻塞 I/O)。这两个术语在讨论 Java NIO 时都是正确的,它们描述了 Java 中用于处理非阻塞 I/O 操作的机制。

二、Java I/O发展史

Java IO(Input/Output)是Java语言中用于读写数据的API,它提供了一系列类和接口,用于读取和写入各种类型的数据。下面是Java IO发展史的简要介绍:

  1. JDK 1.0(1996年) 最初的Java IO只支持字节流(InputStream、OutputStream)和字符流(Reader、Writer)两种,基于阻塞式IO(BIO)模型。
  2. JDK 1.1(1997年) JDK 1.1引入了NIO(New IO)包,支持了缓存区(Buffer)、通道(Channel)等概念,提供了更高效的IO操作方式,可以实现非阻塞式IO(NIO)模式。
  3. JDK 1.4(2002年) JDK 1.4增加了NIO.2 API,也称为Java NIO with buffers,提供了更强大的文件处理功能和更高效的IO操作。
  4. JDK 7(2011年) JDK 7引入了NIO.2的改进版——NIO.2 with Completion Ports,也称为AIO(Asynchronous IO),支持异步IO方式,在处理大量并发请求时具有优势。

三、NIO 的原理

1、核心概念

NIO 的核心概念是通道 (Channel)、缓冲区 (Buffer) 和选择器 (Selector)。

  • 通道(Channel)

通道是一个用于读写数据的对象,类似于Java IO中的流(Stream)。与流不同的是,通道可以进行非阻塞式的读写操作,并且可以同时进行读写操作。通道分为两种类型:FileChannel和SocketChannel,分别用于文件和网络通信。

  • 缓冲区(Buffer)

在Java NIO中,所有数据都是通过缓冲区对象进行传输的。缓冲区是一段连续的内存块,可以保存需要读写的数据。缓冲区对象包含了一些状态变量,例如容量(capacity)、限制(limit)、位置(position)等,用于控制数据的读写。

  • 选择器(Selector)

选择器是Java NIO中的一个重要组件,它可以用于同时监控多个通道的读写事件,并在有事件发生时立即做出响应。选择器可以实现单线程监听多个通道的效果,从而提高系统吞吐量和运行效率。

2、原理分解

p.s.通常我们看到的图会有thread及client两部分,不太好理解nio主要应用到多个网络通信场景,所以把socketserver-->socketclient画出来就更好理解了。

说到Java NIO大家都会想到上面这张图,NIO应用程序的工作流程如下:

  1. 创建通道:打开一个或多个通道,例如FileChannel、SocketChannel等。
  2. 创建缓冲区:为每个通道创建一个或多个缓冲区,用于读取或写入数据。
  3. 注册通道:将通道注册到选择器,以便选择器可以监控这些通道的状态。
  4. 选择就绪通道:选择器等待通道就绪事件,一旦有通道准备好进行I/O操作,选择器将通知应用程序。
  5. 读取/写入数据:应用程序从通道读取数据,或将数据写入通道,使用缓冲区来传输数据。

其中

  • 通道和缓冲区是一对一的关系。每个通道都有一个与之对应的缓冲区,用于存储数据。
  • 选择器(Selector)可以同时监视多个通道的状态。一个选择器可以绑定多个通道,以实现多路复用。

3、代码示例

在jdk的安装包里,这个路径JAVA_HOME/sample我们可以找到nio相应的示例代码。

3.1、简单操作

对于简单的文件操作,通常不需要使用选择器。传统的文件I/O操作(如文件读取和写入)可以通过FileChannel等通道进行,但它们不涉及到多路复用,因为文件读写通常是同步的,不需要监视多个通道的状态(如下面demo中的:inChannel.read(byteBuffer)本身还是一个阻塞的方法)。在这种情况下,选择器并不提供额外的好处。

以下是一个简单的Java NIO示例,演示如何从文件中读取数据并打印到控制台:

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;public class NIOReadFileExample {public static void main(String[] args) {// 创建通道,使用 try-with-resources 语句自动关闭资源try (FileInputStream inputStream = new FileInputStream("source-file-path");FileChannel inChannel = inputStream.getChannel()) {// 创建一个缓冲区ByteBuffer byteBuffer = ByteBuffer.allocate(1024);// 使用 while 循环读取文件中的所有数据while (inChannel.read(byteBuffer) != -1) {// 切换到读模式byteBuffer.flip();// 读取缓冲区中的数据byte[] bytes = new byte[byteBuffer.limit()];byteBuffer.get(bytes);System.out.println(new String(bytes));// 清空缓冲区byteBuffer.clear();}} catch (IOException e) {e.printStackTrace();}}
}

在这个示例中,我们首先打开一个文件通道,然后创建一个ByteBuffer来读取数据。我们使用read()方法从文件通道读取数据到缓冲区,然后使用flip()方法切换到读模式,遍历缓冲区并打印数据。最后,我们使用clear()方法清空缓冲区,切换到写模式,以便继续读取数据。最后,我们关闭通道以释放资源。这是一个简单的示例,实际应用中可能需要更多的错误处理和完善。

Java NIO的使用流程通常包括以下步骤:

  1. 打开通道(Channel):首先,你需要打开一个通道,可以是文件通道、套接字通道等。这通常通过FileChannel.open()或SocketChannel.open()等方法实现。
  2. 创建缓冲区(Buffer):接下来,创建一个或多个缓冲区,用于在通道和应用程序之间传输数据。常见的缓冲区包括ByteBuffer、CharBuffer、IntBuffer等。使用ByteBuffer.allocate()或ByteBuffer.allocateDirect()来创建缓冲区。
  3. 读取/写入数据:使用通道的read()方法来从通道读取数据到缓冲区,或使用write()方法将数据从缓冲区写入通道。对于套接字通道,你可以通过网络发送或接收数据。
  4. 缓冲区操作:对缓冲区进行操作,例如读取或写入数据。你可以使用get()方法来获取数据,使用put()方法来写入数据。
  5. 切换缓冲区:在读取数据后,通常需要切换缓冲区的读模式(flip),然后开始从缓冲区读取数据。同样,在写入数据后,切换缓冲区的写模式(flip)。
  6. 关闭通道:当操作完成后,关闭通道以释放资源,使用通道的close()方法来实现。

3.2、多个网络通信

对于简单的文件操作,通常不需要使用选择器。传统的文件I/O操作(如文件读取和写入)可以通过FileChannel等通道进行,但它们不涉及到多路复用,因为文件读写通常是同步的,不需要监视多个通道的状态。在这种情况下,选择器并不提供额外的好处。

在官方jdk中的exaples中我们可以看到Server有5个子类

  • B1:阻塞式单线程服务器

Blocking/Single-threaded Server

B1一个阻塞式单线程服务器,在完全服务于一个连接之前不会移动到下一个连接。一个线程来处理所有客户端请求。当等待来自客户端的数据或向客户端写入数据时,服务器将阻塞。这意味着服务器一次只能处理一个客户端请求。

这种类型的服务器简单易于实现,但可扩展性差。这是因为服务器一次只能处理一个客户端请求。如果有许多客户端请求数据,服务器将无法快速响应所有请求。

  • BN:阻塞式多线程服务器

Blocking/Multi-threaded Server

一个阻塞式多线程服务器,为每个连接创建一个新线程。

服务器将创建多个线程来处理客户端请求。当一个客户端连接到服务器时,服务器使用一个线程来处理该客户端的请求。

这种类型的服务器比阻塞式单线程服务器具有更好的可扩展性,但它仍然不是非常有效率,因为每个连接都需要一个单独的线程。对于大量连接来说,这会导致大量的线程开销。

  • BP:阻塞式线程池服务器

Blocking/Pooled-thread Server
一个多线程服务器,为服务器使用创建一个线程池。线程池决定如何调度这些线程。服务器将创建一个线程池来处理客户端请求。当一个客户端连接到服务器时,服务器将从线程池中获取一个线程来处理该客户端的请求。当请求处理完毕后,该线程将关闭连接并返回到线程池。

  • N1:非阻塞式单线程服务器

Nonblocking/Single-threaded Server

一个非阻塞式单线程服务器。所有 accept() 和 read()/write() 操作都由一个线程执行,但仅在被 Selector 选中执行这些操作后才执行。服务器将使用 Selector 来监控多个通道的就绪状态。当一个通道就绪时,服务器将从该通道读取数据或向该通道写入数据。

  • N2:非阻塞式双线程服务器

Nonblocking/Dual-threaded Server

一个非阻塞式双线程服务器,在一个线程中执行 accept() 操作,在另一个线程中处理请求。这两个线程都使用 select() 函数。

以下是SocketServer、SocketClient示例代码

SocketServer

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;/*** @Author: Hanko* @Date: 2023-10-12 17:42*/
public class SelectorServer {public static void main(String[] args) throws IOException {// 创建一个服务器套接字通道ServerSocketChannel socketChannel = ServerSocketChannel.open();// 将服务器套接字通道绑定到指定端口socketChannel.bind(new InetSocketAddress(8888));// 将服务器套接字通道设置为非阻塞模式socketChannel.configureBlocking(false);// 创建一个缓冲区ByteBuffer buffer = ByteBuffer.allocate(1024);// 创建一个选择器Selector selector = Selector.open();// 将服务器套接字通道注册到选择器上,监听连接事件socketChannel.register(selector, SelectionKey.OP_ACCEPT);// 循环判断通道已准备好进行I/O操作while (selector.select() > 0) {// 获取所有发生的SelectionKeySet<SelectionKey> selectionKeys = selector.selectedKeys();// 遍历所有SelectionKeyIterator<SelectionKey> iterator = selectionKeys.iterator();while (iterator.hasNext()) {// 获取当前SelectionKeySelectionKey key = iterator.next();// 判断当前键的通道是否准备好接收socket连接if (key.isAcceptable()) {// 接受客户端连接SocketChannel sc = socketChannel.accept();// 将客户端连接通道设置为非阻塞模式sc.configureBlocking(false);// 将客户端连接通道注册到选择器上,监听读事件sc.register(selector, SelectionKey.OP_READ);// 判断当前key的通道是否准备好读取操作} else if (key.isReadable()) {// 获取当前key的通道SocketChannel channel = (SocketChannel) key.channel();// 从通道中读取数据到缓冲区int len = 0;while ((len = channel.read(buffer)) > 0) {// 将缓冲区切换为读模式buffer.flip();// 打印缓冲区中的数据System.out.println(new String(buffer.array(), 0, len));// 将缓冲区重置为写模式buffer.clear();}}// 移除当前事件iterator.remove();}}}
}

SocketClient

public static void main(String[] args) throws IOException {// 获取通道、绑定主机和端口SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 8888));// 切换到非阻塞模式socketChannel.configureBlocking(false);// 创建Buffer写入数据ByteBuffer buffer = ByteBuffer.allocate(1024);// 将当前时间写入缓冲区buffer.put(new Date().toString().getBytes());// 将缓冲区切换为写模式buffer.flip();// 将数据写入通道socketChannel.write(buffer);// 关闭通道socketChannel.close();
}

四、NIO 的应用场景

NIO 适用于以下场景:

  • 网络通信:NIO 可以用于开发高并发的网络应用,例如 Web 服务器、游戏服务器等。
  • 文件操作:NIO 可以用于开发高性能的文件操作应用,例如文件传输、文件压缩等。
  • 进程间通信:NIO 可以用于实现进程间通信,例如共享内存、管道等。
  • 数据库操作:NIO 可以用于提高数据库操作的性能,例如批量插入、批量查询等。

1、在业务中的应用

  • 聊天服务器:使用 NIO 来建立和维护多个客户端连接,并高效地处理客户端请求。
  • 文件传输:使用 NIO 来高效地传输大文件。
  • 数据库操作:使用 NIO 来批量插入或查询数据,提高数据库操作的性能。

2、在框架中的应用

  • Netty

这是一个基于java nio实现的高性能、高可靠性的网络框架,它提供了一系列的组件和工具,用于构建异步、事件驱动的网络应用。Netty被广泛应用在互联网、大数据、游戏、通信等领域,一些著名的开源项目如Dubbo、Zookeeper、RocketMQ、Elasticsearch等都基于Netty构建 。

  • Mina

这是一个基于java nio实现的轻量级网络框架,它支持TCP、UDP、SSL等协议,以及多种编解码器和过滤器。Mina可以用于开发高性能的网络服务器和客户端,一些开源项目如Apache Directory Server、Apache James等都使用了Mina 。

  • Jetty

这是一个基于java nio实现的Web服务器和Servlet容器,它支持HTTP/2、WebSocket等协议,以及反应式编程模型。Jetty可以嵌入到其他应用中,提供Web服务和Web界面,一些开源项目如Eclipse、Hadoop等都使用了Jetty 。

五、优缺点

1、NIO 的优势

NIO 相对于传统 IO 具有以下优势:

  • 提高并发性:NIO 可以使用多路复用器来监听多个通道的事件,提高并发性。
  • 提高性能:NIO 支持非阻塞 IO,可以提高性能。
  • 简化编程:NIO 的 API 更加简洁,易于理解和使用。

2、NIO 的缺点

NIO 相对于传统 IO 具有以下缺点:

  • 学习成本较高:NIO 的概念和 API 与传统 IO 不同,学习成本较高。
  • 不兼容性:NIO 与传统 IO 存在不兼容性,需要注意兼容性问题。

为什么NIO没有广泛的被推广起来呢?

  1. 复杂性:相对于传统的阻塞式I/O,Java NIO 的编程模型更加复杂。它需要开发人员处理事件、缓冲区管理、选择器等概念,这可能会增加学习曲线,尤其是对于新手来说。
  2. 性能优势局限:Java NIO 在高并发和高吞吐量的场景下可以提供性能优势,但对于许多常规应用程序而言,传统的阻塞式I/O 已经足够了。只有需要处理大量并发连接或需要高度定制化的网络通信时,Java NIO 才会显得更有价值。
  3. 第三方库的竞争:有一些第三方库和框架,如Netty和Apache MINA,构建在Java NIO 之上,提供了更易于使用的高性能网络通信解决方案。这些库可能更容易推广,而不是直接使用Java NIO。
  4. 历史原因:许多早期的Java应用程序是基于传统的阻塞式I/O构建的,而且迁移到Java NIO 可能需要重写或修改现有的代码。这使得许多遗留应用程序不愿意切换到新的I/O模型。

相关文章:

探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码

一、NIO简介 Java NIO&#xff08;New IO&#xff09;是Java SE 1.4引入的一个新的IO API&#xff0c;它提供了比传统IO更高效、更灵活的IO操作。与传统IO相比&#xff0c;Java NIO的优势在于它支持非阻塞IO和选择器&#xff08;Selector&#xff09;等特性&#xff0c;能够更…...

论文阅读 Memory Enhanced Global-Local Aggregation for Video Object Detection

Memory Enhanced Global-Local Aggregation for Video Object Detection Abstract 人类如何识别视频中的物体&#xff1f;由于单一帧的质量低下&#xff0c;仅仅利用一帧图像内的信息可能很难让人们在这一帧中识别被遮挡的物体。我们认为人们识别视频中的物体有两个重要线索&…...

Java 常用类(包装类)

目录 八大Wrapper类包装类的分类 装箱和拆箱包装类和基本数据类型之间的转换常见面试题 包装类方法包装类型和String类型的相互转换包装类常用方法&#xff08;以Integer类和Character类为例&#xff09;Integer类和Character类的常用方法 Integer创建机制&#xff08;面试题&a…...

ES|QL:Elasticsearch的 新一代查询语言

作者&#xff1a;李捷 “学会选择很难。学会正确选择更难。而在一个充满无限可能的世界里学会正确选择则更难&#xff0c;也许是太难了。” 巴里-施瓦茨&#xff08;Barry Schwartz&#xff09;在《选择的悖论--多就是少》&#xff08;The Paradox of Choice -More is Less&…...

C语言实现句子中的单词颠倒排序

一、运行结果 二、源代码 # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <assert.h>//实现逆转函数&#xff1b; void reverse(char* left, char* right) {//断言left和right都不能为空&#xff1b;assert(left);assert(right);//循环逆转字母…...

MySQL学习(八)——锁

文章目录 1. 锁概述2. 全局锁2.1 全局锁的必要性2.2 语法2.3 全局锁的特点 3. 表级锁3.1 表锁3.2 元数据锁3.3 意向锁3.4 自增锁 4. 行级锁4.1 介绍4.2 记录锁4.3 间隙锁4.4 临键锁 1. 锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传…...

让iPhone用电脑的网络上网

让iPhone用电脑的网络上网&#xff0c;可以按照以下步骤操作&#xff1a; 在iPhone上找到并点击“设置”选项&#xff0c;进入“蜂窝移动网络”。打开“个人热点”选项。此时下方的弹出对话框会显示“仅USB”。用数据线将你的iPhone与电脑相连&#xff0c;并在电脑上打开“控制…...

ThreeJS-3D教学十-有宽度的line

webgl中线是没有宽度的&#xff0c;现实的应用中一般做法都是将线拓宽成面来绘制。默认threejs的线宽是无法调节的&#xff0c;需要用有厚度的线 THREE.Line2。 先看效果图&#xff1a; 看下代码&#xff1a; <!DOCTYPE html> <html lang"en"> <he…...

安装Elasticsearch步骤(包含遇到的问题及解决方案)

注&#xff1a;笔者是在centos云服务器环境下安装的Elasticsearch 目录 1.安装前准备 2.下载Elasticsearch 3.启动Elasticsearch 非常容易出问题 第一次运行时&#xff0c;可能出现如下错误&#xff1a; 一、内存不足原因启动失败 二、使用root用户启动问题 三、启动ES自…...

网络编程面试笔试真题

网络编程笔试面试真题 1、关于Linux系统中多线程的信号处理&#xff0c;说法中不正确的是&#xff1f; A&#xff1a;在线程环境霞&#xff0c;产生的信号是传递给整个进程的 B&#xff1a;一般情况下&#xff0c;信号会随机给进程的一个线程 C&#xff1a;对某个信号处理函数…...

MySQL官方文档如何查看,MySQL中文文档

这里写自定义目录标题 MySQL官方文档如何查看MySQL中文文档 MySQL官方文档如何查看 MySQL官网地址&#xff1a;https://dev.mysql.com/doc/ 比如这里我要找InnoDB架构 MySQL中文文档 MySQL 5.1中文文档地址&#xff1a;https://www.mysqlzh.com/...

第七章:最新版零基础学习 PYTHON 教程—Python 列表(第四节 -如何在 Python 中查找列表的长度)

列表是 Python 日常编程不可或缺的一部分,所有 Python 用户都必须学习,了解其实用程序和操作是必不可少的,而且总是有好处的。因此,本文讨论了找到第一个这样的实用程序。使用Python 的列表中的元素。 目录 在 Python 中查找列表的长度...

XPS虽没流行,但还在使用!在Windows 10中打开XPS文件的最佳方法

当Windows Vista发布时&#xff0c;微软推出了XPS格式&#xff0c;这是PDF的替代品。XPS文件格式并不是什么新鲜事&#xff0c;但从未获得过多大的吸引力。 因此&#xff0c;XPS&#xff08;XML Paper Specification&#xff09;文件是微软对Adobe PDF文件的竞争对手。尽管XPS…...

23 种设计模式详解(C#案例)

&#x1f680;设计模式简介 设计模式&#xff08;Design pattern&#xff09;代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时…...

@SpringBootApplication配置了scanBasePackages导致请求一直404,分析下原因

出现RequestMapping注解的Controller类可能是因为SpringBootApplication注解中配置了scanBasePackages导致的请求一直返回404错误。 SpringBootApplication注解是Spring Boot的核心注解之一&#xff0c;它用于启动Spring Boot应用程序。这个注解实际上是一个组合注解&#xff…...

{大厂漏洞 } OA产品存在SQL注入

0x01 漏洞介绍 江苏叁拾叁-OA是由江苏叁拾叁信息技术有限公司开发的一款OA办公平台&#xff0c;主要有知识管理&#xff0c;工作流程&#xff0c;沟通交流&#xff0c;辅助办公&#xff0c;集成解决方案&#xff0c;应用支撑平台&#xff0c;基础支撑等功能。 该系统也与江苏叁…...

6-8 舞伴问题 分数 15

void DancePartner(DataType dancer[], int num) {LinkQueue maleQueue SetNullQueue_Link();LinkQueue femaleQueue SetNullQueue_Link();// 将男士和女士的信息分别加入对应的队列for (int i 0; i < num; i) {if (dancer[i].sex M){EnQueue_link(maleQueue, dancer[i]…...

samba服务器的功能是什么

Samba服务器是一个开源的网络文件共享服务&#xff0c;其主要功能是在不同操作系统之间实现文件和打印机共享。它最常用于将Linux/Unix系统与Windows系统互联&#xff0c;但也支持其他操作系统。 以下是Samba服务器的主要功能&#xff1a; 文件共享&#xff1a;Samba允许用户在…...

MSQL系列(五) Mysql实战-索引最左侧匹配原则分析及实战

Mysql实战-索引最左侧匹配原则分析及实战 前面我们讲解了索引的存储结构&#xff0c;BTree的索引结构&#xff0c;以及索引最左侧匹配原则&#xff0c;Explain的用法&#xff0c;今天我们来实战一下 最左侧匹配原则 1.联合索引最左侧匹配原则 联合索引有一个最左侧匹配原则 …...

react|redux状态管理

react|redux状态管理 参考官网&#xff1a;https://cn.redux-toolkit.js.org/tutorials/quick-start 状态管理使用流程 1、安装&#xff1a; npm install react-redux reduxjs/toolkit2、创建store.js 通过configureStore的hook对reducer&#xff08;或slice&#xff09;进行…...

Python之旅----判断语句

布尔类型和比较运算符 布尔类型 布尔类型的定义 布尔类型的字面量&#xff1a; True 表示真&#xff08;是、肯定&#xff09; False 表示假 &#xff08;否、否定&#xff09; 也就是布尔类型进行判断&#xff0c;只会有2个结果&#xff1a;是或否 定义变量存储布尔类型…...

【JavaEE】文件操作和IO

1 什么是文件&#xff1f; 针对硬盘这种持久化存储的I/O设备&#xff0c;当我们想要进行数据保存时&#xff0c;往往不是保存成一个整体&#xff0c;而是独立成一个个的单位进行保存&#xff0c;这个独立的单位就被抽象成文件的概念 2 文件路径 文件路径就是指咱们文件系统中…...

python使用dataset快速使用SQLite

目录 一、官网地址 二、安装 三、 快速使用 一、官网地址 GitHub - pudo/dataset: Easy-to-use data handling for SQL data stores with support for implicit table creation, bulk loading, and transactions. 二、安装 pip install dataset 如果是mysql&#xff0c;则…...

Python 练习100实例(21-40)

Python 练习实例21 题目&#xff1a;猴子吃桃问题&#xff1a;猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不瘾&#xff0c;又多吃了一个第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天…...

“创新启变 聚焦增长”极狐(GitLab)媒体沟通会,共话智能时代软件开发新生态

10 月 18 日 北京 昨日&#xff0c;全球领先 AI 赋能 DevSecOps 一体化平台极狐(GitLab) 在北京举办了主题为“创新启变 聚焦增长”的媒体沟通会。极狐(GitLab) CEO 柳钢就“中国企业数字化转型、软件研发、技术自主可控等热点问题&#xff0c;以及 AI 大模型时代下&#xff0c…...

【ChatGLM2-6B】在只有CPU的Linux服务器上进行部署

简介 ChatGLM2-6B 是清华大学开源的一款支持中英双语的对话语言模型。经过了 1.4T 中英标识符的预训练与人类偏好对齐训练&#xff0c;具有62 亿参数的 ChatGLM2-6B 已经能生成相当符合人类偏好的回答。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&…...

Xilinx IP 10 Gigabit Ethernet Subsystem IP

Xilinx IP 10 Gigabit Ethernet Subsystem IP 10 Gb 以太网子系统在 10GBASE-R/KR 模式下提供 10 Gb 以太网 MAC 和 PCS/PMA,以提供 10 Gb 以太网端口。发送和接收数据接口使用 AXI4 流接口。可选的 AXI4-Lite 接口用于内部寄存器的控制接口。 • 设计符合 10 Gb 以太网规范…...

ubuntu下yolox tensorrt模型部署

TensorRT系列之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速…...

外汇天眼:外汇投资入门必看!做好3件事,任何人都能提高交易胜率

近年来外汇市场愈来愈热络&#xff0c;许多投资人看准世界金融变化的趋势&#xff0c;纷纷开始入场布局&#xff0c;期望把握行情大赚一笔。 如果你之前没有做过外汇交易&#xff0c;建议最好先透过「外汇天眼学院」学习各种相关的知识与技术分析&#xff0c;等到对外汇有一定的…...

idea dubge 详细

目录 一、概述 二、debug操作分析 1、打断点 2、运行debug模式 3、重新执行debug 4、让程序执行到下一次断点后暂停 5、让断点处的代码再加一行代码 6、停止debug程序 7、显示所有断点 8、添加断点运行的条件 9、屏蔽所有断点 10、把光标移到当前程序运行位置 11、单步跳过 12、…...

金坛做网站/seo关键词

已安装的Node.js和主要相关模块是:node.js v14.15.3npm 6.14.9webpack-cli 4.2.0webpack 5.11.0webpack-dev-server 3.11.0启动 web-dev-server 的命令行为 :npx webpack-dev-server --open执行时报错&#xff1a;Cannot find module webpack-cli/bin/config-yargs 结果如下图问…...

代理网站备案表/青岛的seo服务公司

wpf 下载各种控件样式 风格 http://msdn.microsoft.com/en-us/library/aa970773.aspx http://msdn.microsoft.com/en-us/library/default.aspx 制作圆润的tablcontrol 并还有其他代码示例 http://gis4all.ru/zh-CN/wpf/wpf-tabcontrol-rounded-tabitem/ 转载于:https://www…...

充值网站制作/网站策划是干什么的

添加依赖虽然官网已经明确说明如何添加依赖, 我们还是做一下简单的介绍:step 1:配置工程下的build.gradle文件buildscript {repositories {mavenCentral()}dependencies {classpath com.neenbedankt.gradle.plugins:android-apt:1.8}}step 2:配置Module下的build.gradle文件app…...

网站建设视频教程下载/怎么简单制作一个网页

第一章 引言 1.1 文档说明 此文档旨在解释说明学校人员定位管理系统的原理与构成、系统功能和相关案例。未经授权&#xff0c;不得以任何形式转载篡改&#xff0c;奔骝科技不对篡改后的文档负责。 1.2 读者对象集成商销售 依据本解决方案&#xff0c;集成商销售可以确定所需设备…...

网站建设自己在家接单/营销推广的公司

这是微软资深项目经理人StephenMaguire的项目管理经验。希望对大家有用&#xff01; 首先明确一些文中的概念&#xff1a; 项目经理&#xff1a;是项目的负责人&#xff0c;负责拟定进度&#xff0c;监督工作确实按进度实行&#xff0c;确保所有工作都方向正确&#xff0c;不出…...

网站首页栏目怎么做/网络引流怎么做啊?

http://blog.csdn.net/tantexian/article/details/44595885#comments转载于:https://www.cnblogs.com/zengkefu/p/5498719.html...