函数调用

RPC简介及框架选择

你说的曾经没有我的故事 提交于 2020-03-03 07:20:36
简单介绍RPC协议及常见框架,对比传统restful api和RPC方式的优缺点。常见RPC框架,gRPC及序列化方式Protobuf等 HTTP协议 http协议是基于tcp协议的,tcp协议是流式协议,包头部分可以通过多出的\r\n来分界,包体部分如何分界呢?这是协议本身要解决的问题。目前一般有两种方式,第一种方式就是在包头中有个content-Length字段,这个字段的值的大小标识了POST数据的长度,服务器收到一个数据包后,先从包头解析出这个字段的值,再根据这个值去读取相应长度的作为http协议的包体数据。 浏览器connect 80端口 RESTful API (http+json) 理解RESTful架构 - 阮一峰 REST 架构该怎么生动地理解? - 覃超的回答 - 知乎 网站即软件,而且是一种新型的软件,这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。   它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。Representational State Transfer,翻译是”表现层状态转化”,通俗来讲就是:资源在网络中以某种表现形式进行状态转移。 总结一下什么是RESTful架构:   (1)每一个URI代表一种资源;  

经典问题

拟墨画扇 提交于 2020-03-03 06:39:03
第一个问题 当程序存在多个对象的时候,如何确定这些对象的析构顺序? 单个对象创建时构造函数的调用顺序 调用父类的构造过程 调用成员变量的构造函数( 调用顺序与声明顺序相同 ) 调用类自身的构造函数 析构函数与对应构造函数的调用顺序相反 多个对象析构时 析构顺序与构造顺序相反,比如构造对象A,B,C,析构就是C,B,A 例子: # include <stdio.h> class Member { private : const char * ms ; public : Member ( const char * s ) { ms = s ; printf ( "Member %s create\n" , ms ) ; } ~ Member ( ) { printf ( "Member %s destroy\n" , ms ) ; } } ; class Test { private : Member mA ; Member mB ; public : Test ( ) : mB ( "mB" ) , mA ( "mA" ) { printf ( "Test()\n" ) ; } ~ Test ( ) { printf ( "~Test()\n" ) ; } } ; Member gA ( "gA" ) ; int main ( void ) { Test t ; return 0 ;

C++ Primer 学习笔记 第七章 类

依然范特西╮ 提交于 2020-03-03 05:59:05
类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程技术,类的接口包括用户所能执行的操作,类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。封装实现了类的接口和实现的分离,封装后的类隐藏了它的实现细节,即类的用户只能使用接口而不能访问实现部分。 类要想实现数据抽象和封装,首先需要定义一个抽象数据类型,在抽象数据类型中,由类的设计者负责考虑类的实现过程,而使用该类的程序员只需要抽象地思考类型做了什么,而无须了解类型的工作细节。 我们可以通过抽象数据类型提供的接口来完成某些操作,但如果一个类没有任何接口供用户使用,只有一些数据成员,那这个类就不是抽象数据类型,一旦定义了一些成员函数供类的用户使用,它就变成了了抽象数据类型。 定义和声明成员函数的方式与普通函数差不多,成员函数的声明必须在类的内部,但它的定义既可以在类的内部,也可以在类的外部。定义在类内部的函数是隐式的inline函数。 Sales_data类: struct Sales_data { string isbn ( ) const { return bookNo ; } Sales_data & combine ( const Sales_data & ) ; double avg_price ( ) const ; string bookNo ; unsigned units

常见RPC开源框架

穿精又带淫゛_ 提交于 2020-03-03 05:52:13
什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如这样一个函数方法: localAdd(10, 20),localAdd方法的具体实现要么是用户自己定义的,要么是php库函数中自带的,也就说在localAdd方法的代码实现在本地,它是一个本地调用! 远程调用意思就是:被调用方法的具体实现不在程序运行本地,而是在别的某个远程地方。 最早在 Nelson 的论文中指出实现 RPC 的程序包括 5 个理论模型部分: User User-stub RPCRuntime Server-stub Server 这 5 个部分的关系如下图所示: 这里 User 就是 Client 端。当 User 想发起一个远程调用时,它实际是通过本地调用 User-stub。 User-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime 实例传输到远端的实例。 远端 RPCRuntime 实例收到请求后交给 Server-stub 进行解码后发起向本地端 Server 的调用,调用结果再返回给 User 端。 远程调用原理 比如 A (client) 调用 B (server) 提供的remoteAdd方法:

第8节_调用函数

最后都变了- 提交于 2020-03-03 05:10:08
def age ( a ) : return 18 <= a < 30 def level ( s ) : return 85 <= s <= 100 定义函数,age,给age赋值a,a的范围见上 定义函数,level,给level赋值s,s的范围见上 stu = stu . loc [ stu [ 'Age' ] . apply ( age ) ] Stu.[‘Age’]这一列用age函数, Loc,保留此列 stu = stu . loc [ stu [ 'Age' ] . apply ( age ) ] . loc [ stu [ 'Score' ] . apply ( level ) ] 同上, Stu.[‘Age’]这一列用age函数, Stu.[‘Score’]这一列用level函数, Loc,保留此列 以下是代码优化: stu = stu . loc [ stu . Age . apply ( age ) ] . loc [ stu . Score . apply ( level ) ] stu[‘Age’]可优化为stu.Age stu = stu . loc [ stu . Age . apply ( lambda a : 18 <= a < 30 ) ] 定义函数部分 def age(a): return 18<=a<30 可优化为lambda表达式

迭代器,生成器,装饰器

断了今生、忘了曾经 提交于 2020-03-03 02:02:25
1.1迭代器 1.2生成器 1.3装饰器 迭代器 1. 迭代器定义 迭代是Python最强大的功能之一,是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next()。 字符串,列表或元组对象都可用于创建迭代器: 2.可迭代对象 : 在Python世界里,一切皆对象。对象根据定义的维度,又可以分为各种不同的类型,比如:文件对象,字符串对象,列表对象。。。等等。 一句话:“实现了__iter__方法的对象就叫做可迭代对象”,__iter__方法的作用就是返回一个迭代器对象。 直观理解就是能用for循环进行迭代的对象就是可迭代对象。比如:字符串,列表,元祖,字典,集合等等,都是可迭代对象。 3.next()与iter(): next()返回迭代器的下一个项目 next语法: next(iterator[,dafault]) iterator – 可迭代对象 default – 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。 4.iter()函数用来生成迭代器 # 迭代器实现斐波那契数列 class Fib ( ) : def __init__ ( self , n )

你不知道的JavaScript上卷笔记

社会主义新天地 提交于 2020-03-03 00:25:58
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript 是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目吸引眼球,以致最初真没去看内容。直到出了中文版《你不知道的JavaScript》,一看评价大家都说好,买来一读,内容果然很好,很多地方,让我这个半路转行JavaScript的人豁然开朗。中文版现在出了上卷,中卷应该很快会推出,下卷就要等久一点了 作用域和闭包 作用域是什么   1.现代JavaScript已经不再是解释执行的,而是编译执行的。但是与传统的编译语言不同,它不是提前编译,编译结果不能进行移植。编译过程中,同样会经过 分词/词法分析 , 解析/语法分析 , 代码生成 三个阶段。   2.以var a = 2;语句为例,对这一程序语句对处理,需要经过 引擎 , 编译器 , 作用域 三者的配合。其中, 引擎 从头到尾负责整个javascript程序的编译和执行过程; 编译器 负责语法分析和代码生成; 作用域 负责收集并维护由所有声明的标识符组成的系列查询,并实施一套规则,确定当前执行的代码对这些标识符的访问权限。   3.对于var a = 2;编译器首先查找作用域中是否已经有该名称的变量,然后引擎中执行编译器生成的代码时,会首先查找作用域。如果找到就执行赋值操作,否则就抛出异常

go-函数

馋奶兔 提交于 2020-03-02 18:34:01
函数是组织好的、可重复使用的、用于执行指定任务的代码块。 函数 Go语言中支持函数、匿名函数和闭包,并且函数在Go语言中属于“一等公民”。 函数允许多返回值; 函数本身可以作为值进行传递; 函数可以作为变量的值; 函数可以作为参数和返回值; 支持匿名函数(没有名字的函数)一般用于工厂模式; 可以满足接口; 函数:可重复使用的、实现单一或相关联的代码片段,其目的是模块化编程,提高模块性和代码的复用率。 函数的定义 Go语言中定义函数使用 func 关键字,具体格式如下: 1 func 函数名(参数)(返回值){ 2 函数体 3 } 其中: 函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名。 参数:参数由参数变量和参数变量的类型组成,多个参数之间 , 使用分隔。 返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用 () 包裹,并用 , 分隔。 函数体:实现指定功能的代码块。 我们先来定义一个求两个数之和的函数: 1 func intSum(x int, y int) int { 2 return x + y 3 } 函数的参数和返回值都是可选的,例如我们可以实现一个既不需要参数也没有返回值的函数: 1 func sayHello() { 2 fmt.Println("Hello 望京") 3 }

以基于Reactor模式的高并发EchoServer为例剖析muduo库框架

£可爱£侵袭症+ 提交于 2020-03-02 17:40:49
前言 在讲解基于muduo库的高并发echo服务器之前,我们先来回顾一下我们一般编写基于Reactor模式的高并发服务器的基本流程。 muduo的EchoServer其实也是基于上述流程,只不过进行了一定程度地封装,本质上仍是Reactor模式。muduo的example中的echo服务器代码展示的是只有一个reactor的服务器,muduo其实支持one loop per thread + 线程池的模式,也即multiple reactors + 业务线程池的模式,也就是服务器同时有多个IO线程,其中Acceptor所在的IO线程成为mainReactor,其他的IO线程成为subReactor,mainReactor主要负责处理监听描述符listenfd的上的时间,也就是负责处理客户端的连接请求。而subReactor主要负责已连接描述符connfd上的事件,也就是在和客户端建立好连接之后负责处理和客户端的具体通信。mainReactor+subReactor是由多个IO线程实现的,在muduo库当中,其通过在IO线程池中设置是让其工作在单IO线程模式还是多IO线程模式。而所谓的业务线程池主要是指计算线程池,其主要负责处理具体的业务逻辑,不涉及具体的IO操作。 在认真阅读完一遍muduo库源码之后,我认为如果想基于muduo库编写一个单线程版的echo服务器

如何设计一个RPC系统

北城余情 提交于 2020-03-02 16:37:37
版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接: https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qcloud.com/community RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高。但是RPC本身的构成却比较复杂,由于受到编程语言、网络模型、使用习惯的约束,有大量的妥协和取舍之处。本文就是通过分析几种流行的RPC实现案例,提供大家在设计RPC系统时的参考。 由于RPC底层的网络开发一般和具体使用环境有关,而编程实现手段也非常多样化,但不影响使用者,因此本文基本涉及如何实现一个RPC系统。 认识RPC(远程调用) 我们在各种操作系统、编程语言生态圈中,多少都会接触过“远程调用”的概念。一般来说,他们指的是用简单的一行代码,通过网络调用另外一个计算机上的某段程序。比如: RMI——Remote Method Invoke:调用远程的方法。“方法”一般是附属于某个对象上的,所以通常RMI指对在远程的计算机上的某个对象,进行其方法函数的调用。 RPC——Remote Procedure Call:远程过程调用。指的是对网络上另外一个计算机上的,某段特定的函数代码的调用。 远程调用本身是网络通信的一种概念