使用 @GrpcClient 实现客户端

转载请注明出处:

  @GrpcClient 注解的作用是将 gRPC 客户端注入到 Spring 容器中,方便在应用程序中使用 gRPC 客户端调用 gRPC 服务提供的函数。使用 @GrpcClient 注解,我们可以像使用其他 Spring Bean 一样来使用 gRPC 客户端,无需手动创建连接通道和 stub 类对象,Spring Boot 会自动为我们进行管理和维护。

  使用 @GrpcClient 注解的场景通常是在 Spring Boot 中使用 gRPC 客户端时,因为 Spring Boot 已经为我们提供了自动配置功能,可以简化 gRPC 客户端的配置和使用。在这种场景下,我们只需要在应用程序中添加 @GrpcClient 注解,然后在配置文件中添加 gRPC 客户端的配置信息,就可以方便地使用 gRPC 客户端了。

  另外,@GrpcClient 注解还可以指定 gRPC 服务的名称,以区分不同的 gRPC 服务。这对于在同一个应用程序中使用多个 gRPC 服务时非常有用,可以避免不同的 gRPC 服务之间发生冲突。例如:

@GrpcClient("greeter")
private GreeterGrpc.GreeterBlockingStub greeterStub;
@GrpcClient("calculator")
private CalculatorGrpc.CalculatorBlockingStub calculatorStub;

  在上述示例中,我们分别为 greeter 和 calculator 两个 gRPC 服务创建了不同的 stub 类对象,并使用了不同的 @GrpcClient 注解来区分它们。

以下是一个完整的使用@GrpcClient注解的使用代码:

1.配置maven相关依赖

  gRPC客户端使用一下命令添加 Maven 依赖项:

<dependency>
    <groupId>net.devh</groupId>
    <artifactId>grpc-client-spring-boot-starter</artifactId>
    <version>2.12.0.RELEASE</version>
</dependency>
<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-netty-shaded</artifactId>
  <version>1.37.0</version>
</dependency>
<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-protobuf</artifactId>
  <version>1.37.0</version>
</dependency>
<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-stub</artifactId>
  <version>1.37.0</version>
</dependency>

  并添加一下插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
            <version>0.6.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <protocArtifact>com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}</protocArtifact>
                <pluginId>grpc-java</pluginId>
                <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.30.2:exe:${os.detected.classifier}</pluginArtifact>
                <outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>
                <clearOutputDirectory>false</clearOutputDirectory>
                <includeCompileClasspath>true</includeCompileClasspath>
            </configuration>
        </plugin>
    </plugins>
</build>

 

2.添加proto文件:

syntax = "proto3";
package com.example.grpcdemo.service;
option java_multiple_files = true;
option java_package = "com.example.grpcdemo.service";
option java_outer_classname = "UserServiceProto";
message UserRequest {
    string name = 1;
    int32 age = 2;
}
message UserResponse {
    string message = 1;
}
service UserService {
    rpc addUser (UserRequest) returns (UserResponse);
    rpc deleteUser (UserRequest) returns (UserResponse);
    rpc updateUser (UserRequest) returns (UserResponse);
    rpc getUser (UserRequest) returns (UserResponse);
}

  执行mvn clean install命令即可将proto文件编译成Java类并生成到target/generated-sources/protobuf/java目录下。 编译后的Java类包括服务类、消息类和客户端类。以本例中的proto文件为例,编译后的Java类如下:

  • 服务类:UserServiceGrpc.java
  • 消息类:UserRequest.javaUserResponse.java
  • 客户端类:UserServiceGrpc.UserServiceBlockingStub.java 接下来,我们可以使用@GrpcClient注解将UserServiceGrpc.UserServiceBlockingStub类型的gRPC客户端注入到Spring Bean中。

3.使用@GrpcClient实现服务端  

  示例代码如下:

@Component
public class UserGrpcClient {
    @GrpcClient("user-service-provider") // 指定gRPC服务在配置中的服务名
    private UserServiceGrpc.UserServiceBlockingStub userService;
    public void addUser(UserRequest request) {
        UserResponse response = userService.addUser(request);
        // 处理响应结果
    }
}

  在这个例子中,我们使用@GrpcClient注解将UserServiceGrpc.UserServiceBlockingStub类型的gRPC客户端注入到了Spring Bean中,并在addUser()方法中使用该gRPC客户端访问远程gRPC服务。需要注意的是,在使用@GrpcClient注解时,需要指定gRPC服务的服务名。

4.配置文件中配置grpc的配置信息

  配置文件中配置 grpcClient 相关的配置

grpc:
  client:
    user-service-provider:
      address: localhost            # gRPC服务地址
      port: 6565
      plaintext: true                # 指定是否使用明文连接;
      enableKeepAlive: true            # 是否启用KeepAlive机制
      keepAliveTime: 30s            # KeepAlive时间
      keepAliveTimeout: 5s              # 是否在没有gRPC调用时保持KeepAlive的连接

5.客户端调用

  在应用程序中,使用UserGrpcClient类访问gRPC服务,示例代码如下:

import com.example.grpcdemo.service.UserRequest;
import com.example.grpcdemo.service.UserResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
    @Autowired
    private UserGrpcClient userGrpcClient;
    
    @RequestMapping("/addUser")
    public String addUser(UserRequest request) {
        UserResponse response = userGrpcClient.addUser(request);
        return response.getMessage();
    }
}

  在这个例子中,我们在UserController中注入了UserGrpcClient,并在addUser()方法中使用该客户端访问远程gRPC服务,处理响应结果并返回给前端。

 

本文转载于网络 如有侵权请联系删除

相关文章

  • 最短路径dijkstra,floyd

    最短路径分为两类,单元最短路径和多源最短路径。单源最短路径给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径[1]问题。无权图的单源最短路径这里我先说一下我的理解,我们求一个顶点到其它各顶点的最短路径,那么肯定得用bfs算法来遍历。之前的图的遍历和应用中,dfs用了很多,那么现在完全就是类比的概念了,在求两个顶点u,v的路径长度的时候,我们给dfs加了两个形参终点v和长度的d,那么这个bfs的算法也是类是的,不过我们得需要一个数组存储每个顶点到原点的距离,因为是遍历所有的顶点,那么形参v就可以省去了,此时我们需要带一个形参数组进去吗??其实大可不必,别忘了我们还有visited(标记数组),我们完全可以用它来存储数据,(那么标记的作用岂不是消失了?)并没有,我们初始值,设为一个一看就不是该顶点到初始顶点的距离的数,比如-1,这样当我们存储改顶点到初始顶点的值进去了,直接判断大于0即可,别忘了,我们还需要一个数组来存储路径,(岂不是需要n

  • 人工智能学术速递[7.16]

    访问www.arxivdaily.com获取含摘要速递,涵盖CS|物理|数学|经济|统计|金融|生物|电气领域,更有搜索、收藏、发帖等功能!点击阅读原文即可访问cs.AI人工智能,共计55篇【1】AGentleIntroductiontoConformalPredictionandDistribution-FreeUncertaintyQuantification 标题:温文尔雅地介绍保角预测和无分布不确定性量化 作者:AnastasiosN.Angelopoulos,StephenBates 备注:BlogandtutorialvideothishttpURL 链接:https://arxiv.org/abs/2107.07511 摘要:黑箱机器学习方法现在经常用于高风险环境,如医疗诊断,这需要不确定性量化,以避免间接的模型故障。无分布不确定性量化(Distribution-freeUQ)是一种用户友好的范例,用于为此类预测创建统计上严格的置信区间/集。关键的是,区间/集合在没有分布假设或模型假设的情况下是有效的,并且具有有限多个数据点的显式保证。适应输入的难度;当输入示例很困难时,

  • 一天刷到5篇「x is All You Need」,当学术论文开始标题党……

    机器之心报道编辑:魔王在机器学习论文数量迅速增加的当下,「标题党」趋势也正在抬头。然而,「标题党」虽好,也要当心同质化啊。2017年6月,Transformer横空出世,迅速成为自然语言处理领域中的主流预训练模型,并在近期迎来了在计算机视觉等多个领域中的跨界应用热潮。但它引领的潮流不止于此。其原始论文《AttentionisAllYouNeed》发表后,各种标题中包含「XisAllYouNeed」的论文层出不穷。但此类「XisAllYouNeed」论文篇篇都有高含金量吗?X真的重要到「AllYouNeed」的程度吗?还是论文作者把这个句式当做「财富密码」?或许我们可以从其「通货膨胀」程度一窥究竟。佐治亚理工学院机器学习博士生AranKomatsuzaki发推表示:「光今天的arXivfeed流就出现了大概五篇标题中包含『XisAllYouNeed』的论文。现在这个句式可能已经过于普遍了。」机器之心在arXiv平台上以「AllYouNeed」作为关键词进行了搜索,仅2月份标题中包含「AllYouNeed」的论文就多达6篇,部分截图如下:图源:https://arxiv.org/searc

  • 1.新建django项目NewCenter

    新建django项目NewCenter1.开发环境1.系统:Windows72.开发工具:pycharm3.数据库:MySQL5.7还是得选择5.7,选择8..0版本的,在往Ubuntu上部署项目的时候,真的坑得要死。MySQL5.7.25.0下载地址:https://dev.mysql.com/downloads/file/?id=482771复制如果之前在电脑里安装了MySQL8.0版本,需要先卸载干净了以后再安装MySQL5.7卸载MySQL8.0教程:https://jingyan.baidu.com/article/ca41422f0d42701eae99edb2.html复制安装MySQL5.7最省心的办法,就是一直下一步,所有的都选择默认设置就可以了。4.Navicat5.Xshell66.FileZilla7.python3.6电脑里安装的是python3.7.2,但是服务器上默认安装的python3目前只到3.6,所以要先卸载电脑里的python3.7,改安装python3..6如何彻底卸载python的网址:https://jingyan.baidu.com/art

  • 使用Rook+Ceph在Kubernetes上作持久存储

    作者:EarlC.RubyIII 我想在新的Kubernetes集群上安装Prometheus和Grafana,但为了使这些软件包能够工作,他们需要一些地方来存储持久数据。当我在Seagate担任云架构师时,我已经对Ceph进行了性能和规模测试,并且在过去的一年里玩过Rook,所以我决定安装Rook+Ceph,并将其用于Kubernetes集群的数据存储。Ceph是一个分布式存储系统,提供对象、文件和块存储。在每个存储节点上,您将找到Ceph存储对象的文件系统和CephOSD(对象存储守护程序)进程。在Ceph集群上,您还可以找到CephMON(监控)守护程序,它们确保Ceph集群保持高可用性。Rook充当Ceph在Kubernetes的业务流程层,将OSD和MON流程部署为POD副本集。来自Rook的README文件:Rook将存储软件转变为自我管理、自我扩展和自我修复的存储服务。它通过自动化部署,引导,准备,配置,扩展,升级,迁移,灾难恢复,监控和资源管理来实现此目的。Rook使用底层云原生容器管理,调度和编排平台提供的工具来执行其职责。 https://github.com/

  • PHP设计模式之命令模式

    PHP设计模式之命令模式命令模式,也称为动作或者事务模式,很多教材会用饭馆来举例。作为顾客的我们是命令的下达者,服务员是这个命令的接收者,菜单是这个实际的命令,而厨师是这个命令的执行者。那么,这个模式解决了什么呢?当你要修改菜单的时候,只需要和服务员说就好了,她会转达给厨师,也就是说,我们实现了顾客和厨师的解耦。也就是调用者与实现者的解耦。当然,很多设计模式可以做到这一点,但是命令模式能够做到的是让一个命令接收者实现多个命令(服务员下单、拿酒水、上菜),或者把一条命令转达给多个实现者(热菜厨师、凉菜厨师、主食师傅)。这才是命令模式真正发挥的地方!!Gof类图及解释GoF定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作GoF类图代码实现classInvoker { public$command; publicfunction__construct($command) { $this->command=$command; } publicfunctionexec() { $this->command-&g

  • UML 教程

    UML教程关键词:部署图,组件图,包图,类图,复合结构图,对象图,活动图,状态机图,用例图,通信图,交互概述图,时序图,时间图 简介部署图组件图包图类图复合结构图对象图活动图状态机图用例图通信图交互概述图时序图时间图UML工具更多内容简介UML图类型UML图类型如下图所示:结构式建模图结构式建模图(Structurediagrams)强调的是系统式的建模。结构图定义了一个模型的静态架构。它们通常被用来对那些构成模型的‘要素'建模,诸如:类,对象,接口和物理组件。另外,它们也被用来对元素间关联和依赖关系进行建模。 类图对象图包图组件图部署图复合结构图行为式建模图行为式建模图(Behaviordiagrams)强调系统模型中触发的事。行为图用来记录在一个模型内部,随时间的变化,模型执行的交互变化和瞬间的状态;并跟踪系统在真实环境下如何表现,以及观察系统对一个操作或事件的反应,以及它的结果。 活动图状态图用例图通信图交互概述图时序图时间图UML概念UML从来源中使用相当多的概念。我们将之定义于统一建模语言术语汇表。下面仅列代表性的概念。对于结构而言-执行者,属性,类,元件,接口,对

  • Dashboard设计思考(上篇)

    前言在企业类应用服务(SaaS)、检测工具(手机安全助手)、量化自我工具(智能手环)等后台管理系统中,使用Dashboard可以帮助用户监控和分析数据,快速获取重要信息。但如果对Dashboard设计缺乏认知,就很可能会造成Dashboard呈现的信息杂乱,充斥着无关紧要的指标、文本信息及各种半成品的图表等,让用户抓不到重点。那么,设计师该如何设计内容精确、体验友好的Dashboard以满足用户需求呢?文章将从以下几个方面思考:1、Dashboard是什么?2、主要场景是什么?能为用户带来什么价值?3、目标用户分析4、选定Dashboard内容5、Dashboard内容结构6、功能特性7、信息设计一、Dashboard是什么?在了解Dashboard之前,可以先了解下汽车仪表盘和报表。Dashboard的中文翻译是“仪表盘”,与汽车的仪表盘相同——一种反映车辆各系统工作状况的装置,有车速里程表、转速表、燃油表等。同时,还会有各式各样的指示灯或警报灯,例如冷却液液面警报灯、燃油量指示灯、充电指示灯等。司机可以很方便地从汽车仪表盘中获得汽车整体状况。而对于报表,简单的说就是用表格、图表等格

  • Caffe使用openblas实现CPU模式使用多线程

    (接前文)在Caffe的默认编译安装使用的是ATLAS库,但是这个版本的BLAS不能利用多核CPU,要使用多核CPU并行计算来加速Caffe则需要使用OpenBLAS。下面就说说怎样来使用OpenBLAS。在默认编译Caffe后,我们使用“lddbuild/tools/caffe”命令查看时可以看到使用的是openblas的单线程版本,如下:$lddbuild/tools/caffe|grepopenblas libopenblas.so.0=>/lib64/libopenblas.so.0(0x00007f1fe656f000)复制如果要使用openblas的多线程版本,此时应该看到类似下面的结果,其中so文件最后的“p”即表示是多线程版本。$lddbuild/tools/caffe|grepopenblas libopenblasp.so.0=>/lib64/libopenblasp.so.0(0x00007f0854b90000)复制下面我们就看看应该怎样编译使用多线程版本OpenBLAS来编译caffe。编译首先,修改“Makefile.config”文件,将其中B

  • Golang语言 上传文件

    import( "bufio" "flag" "fmt" "io" "log" "os" "os/exec" "path/filepath" "strings" "time" ) const( filename="c:\\myetc\\remote.etc" ) funcmain(){ varservicefilepathstring varserviceIPstring varpasswdstring varserviceusernamestring varportstring //参数判断 iflen(os.Args)==1{ fmt.Printf("usage:%sfilename1filename2...\n",filepath.Base(os.Args[0])) return } //打开之前应该判断文件是否存在 _,err:=os.Sta

  • 巧用*_his表记录操作历史

    文章转载自「开发者圆桌」一个关于开发者入门、进阶、踩坑的微信公众号 许多OLTP应用的开发者都知道,一些重要的操作要记录操作历史,把操作前的数据备份到历史表,然后再执行相应的修改操作。这样可以获取某个时点的操作日志和操作前的记录值。   要记录操作历史有两个层面,一个是应用层即通过应用程序逻辑实现历史记录的保存,一个是数据库层即数据库归档、审计等DBA管理的功能。这里仅讨论前者。   比如有一个用户表t_user包含id,name,sex,age字段,因为t_user表的修改非常重要,要记录操作历史,一般的做法是建立和t_user结构相同的一个历史表命名为t_user_his,它包含id,name,sex,age字段,同时添加对应的his_id,oper_time,oper_remark等记录操作说明的字段。   OK,表设计完毕了,我们需要在修改时记录用户之前的信息,一般的做法是先来个insert插入历史表,然后再去修改原表数据,把这两个操作放到同一个事务中去处理,释义代码如下: setAutoCommit(false); insertintot_us

  • 基于脚本的modelsim自动化仿真笔记

      这里记录一下基于脚本的modelsim自动化仿真的一些知识和模板,以后忘记了可以到这里查找。转载请标明出处:http://www.cnblogs.com/IClearner/ 。 一、基本介绍   这里介绍一下如何利用脚本调用modelsim进行自动化仿真,随笔前面先介绍一下前仿真,随笔结尾处介绍后仿真。前仿真的基本介绍如下所示,由于我的笔记是写在.do文件中,因此我这里也给代码的格式,如下所示: ##表示注释,modelsim不支持中文,因此可能不能识别注释 #①退出当前仿真功能,退出当前的工程,跟在modelsim界面的命令行敲入命令的效果一样,之后就可以创建其他的工程 quit-sim #②清除命令行显示信息;在命令行‘敲入这个命令,回车’的效果一样 .mainclear #③创建库:vlib:创建库到一个物理目录中,也就是创建文件夹目录了。 #可以理解库为某一个路径的文件夹,用来存储modelsim的一些数据文件; #创建库的格式vlib<libraryname>,默认库的名字为work #下面的代码意思是:1-在当前路径(.do文件的路径)下,创建

  • mongoDB看这篇就够了

    写在前面 hello,小伙伴们,我是pubdreamcc,本篇文章依旧出至于我的GitHub仓库node学习教程,如果你觉得我写的还不错,欢迎给个star,小伙伴们的star是我持续更新的动力! node学习教程GitHub 安装mongoDB 安装这里,我就不详细介绍,大家可以根据官网选择匹配自己电脑系统的版本安装即可。 mongoDBdownload地址:download 下载下来之后,点击打开直接下一步,下一步就ok了。 初体验 配置环境变量 安装完成后,会在安装目录下面生成一个mongoDB的文件夹,打开文件夹,进入bin文件夹中,把这里的路径配置成环境变量。 创建存储数据库文件data 在任意盘符根目录下创建一个data目录,用来存放数据库文件。mongoDB会自动把自己安装位置的盘符根目录下的data文件夹作为自己的数据存储目录,这里也可以直接在安装位置所在盘符创建。 启动mongoDB数据库 如果data目录创建在安装位置的盘符根目录下,直接 打开命令行,敲入: mongod 复制 如果是其他位置,则需要指定数据存放的位置: mongod--dbpath文

  • wordpress生成sitemap,并提交到360站长平台!

    安装插件WPJAM,安装完成后点击扩展管理,勾选简单SEO。   点击左侧栏中的SEO设置,下方显示有sitemap的路径地址。复制在记事本中。用于后期放置在百度站长、360站长等平台上。   打开360站长平台,网址为:https://zhanzhang.so.com/,如下图所示: 点击站点管理,添加网站网址(如果是https站点,记得要认证下),如下图:   然后点击sitemap提交,将一开始保存在记事本中的路径,复制到当前页中,点击提交后,如下图所示: 如果要收录单个URL,可以点击URL收录,对单个URL进行收录。   可以对自己的网站进行抓取诊断,来判断360的爬虫是否对PC和手机端的网址抓取是否成功。如下图: 点击流量分析,可以查看在360平台上,用户访问流量。   讲解完毕,希望大家多多支持,关注我,获取更多一手原创技术文章,两宝程序cboii跟大家分享技术,共同进步!   作者:Cboii 出处:https://www.cnblogs.com/chenboyi081/ 本博客所有文章仅用

  • android 8.0 适配(总结)

    android8.0对应的sdk版本 26 1.通知栏 Android8.0引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。 针对8.0的应用,创建通知前需要创建渠道,创建通知时需要传入channelId,否则通知将不会显示。示例代码如下: //创建通知渠道 privatevoidinitNotificationChannel(){ if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){ CharSequencename=mContext.getString(R.string.app_name); NotificationChannelchannel=newNotificationChannel(mChannelId,name,NotificationManager.IMPORTANCE_DEFAULT); mNotificationManager.createNotificationChannel(channel); } } //创建通知传入channelId Not

  • TCP/IP状态详解[转]

    TCP正常建立和关闭的状态变化     TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手。   建立连接   在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据,也就是ESTABLISHED状态。    结束连接     TCP有一个特别的概念叫做half-close,这个概念是说,TCP的连接是全双工(可以同时发送和接收)连接,因此在关闭连接的时候

  • 交货单实际发货日期修改

    REPORTZ_POSTING_DELIVERY. DATA:code(255)TYPEcOCCURS0, progLIKEsy-repidvalue'ZCHD_ZSDR021'. *Insert'*@#@@[SAP]'intoCODE *INDEX13. DATA:BEGINOFI_VBKOKOCCURS11. INCLUDESTRUCTUREVBKOK. DATA:ENDOFI_VBKOK. DATA:BEGINOFI_VBPOK_TABOCCURS12. INCLUDESTRUCTUREVBPOK. DATA:ENDOFI_VBPOK_TAB. PARAMETERS:P_VBELNTYPEVBELN. DATA:G_LIKPLIKELIKP. DATA:G_LIPSLIKELIPS. DATAGV_14(14)TYPEC. START-OF-SELECTION. *READREPORTprogINTOcode. *checksy-subrc=0. *insert'*@#@@[SAP]'intocodeindex1. *INSERTREPORTprogFROMcode

  • 详解 GFS分布式文件系统 (条带卷/复制卷/分布式条带卷/分布式复制卷)

    GFS分布式文件系统一.GlusterFS概述1.GlusterFS简介2.GlusterFS特点3.GlusterFS术语4.模块化堆栈式架构5.GlusterFS工作流程6.弹性HASH算法7.GlusterFs的卷类型二.部署GlusterFs群集三.客户端部署与测试测试总结补充:                                                                                                     &nb

  • 实验4

    task1_1.cask1_1.c#include<stdio.h> #defineN4 intmain() { inta[N]={2,0,2,2}; charb[N]={'2','0','2','2'}; inti; printf("sizeof(int)=%d\n",sizeof(int)); printf("sizeof(char)=%d\n",sizeof(char)); printf("\n"); for(i=0;i<N;++i) printf("%p:%d\n",&a[i],a[i]); printf("\n"); for(i=0;i<N;++i) printf("%p:%c\n",&b[i],b[i]); printf("\n"); printf("a=%p\n",a); printf("b=%p\n",b); return0; }复制 task1_2.c#include<stdio.h> #defineN2 #defineM3 intmain() { inta[N][M]={{1,2,3},{4,

  • 数据清洗--DataFrame中的空值处理

    数据清洗是一项复杂且繁琐的工作,同时也是整个数据分析过程中最为重要的环节。 在python中空值被显示为NaN。首先,我们要构造一个包含NaN的DataFrame对象。 删除表中全部为NaN的行 删除表中任何含有NaN的行 删除表中全部为NaN的列 删除表中任何含有NaN的列 注意:axis就是”轴,数轴“的意思,对应多维数组里的”维“。此处作者的例子是二维数组,所以,axis的值对应表示:0轴(行),1轴(列)。 如果不想过滤(去除)数据,我们可以选择使用fillna()方法填充NaN,这里,作者使用数值’0’替代NaN,来填充DataFrame。 我们还可以通过字典来填充,以实现对不同的列填充不同的值。 使用python进行数据清洗 

  • Problem: 八中生成树2 (C语言)

    Problem:八中生成树2Problem:八中生成树2TimeLimit:1Sec  MemoryLimit:128MB[Submit][Status][WebBoard]Description八中里面有N个建设物,M条边。 对于这种要建最小生成树的问题,你应该很熟练了。 现在老大决定降低某条边的费用,然后这条边必须要被选中,因为这条路他每天都要走,自然...... 问选了这条边后是否可以得到一个比从前总开支相等或更小的方案。Input第一行三个整数N,M,Q(1<=N<=10000,N-1<=M<=100000,0 接下来M行,每行三个整数(X,Y,Z)描述一条可以建造的路。0<=Z<=10000  最后Q行,每行两个整数i,x(1<=i<=M,0<=x)描述一个修改计划, 即要你判断如果将第i条公路的修建费用降低为x元后,是否可以得到一个比从前总开支相等或更小的方案Output按顺序输出Q行,每行输出"Yes"或"No",Yes表示可以建造,No表示不可能SampleInput 343 12

相关推荐

推荐阅读