Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

thrift

基本步骤

  1. 定义接口
  2. 实现server
  3. 实现client

IDL文件

thrift官方给了类似C++的IDL文件示例(文件后缀为.thrift),地址为tutorial.thirt

  • 划分相应的命名空间
  • 定义相关的数据类型
  • 定义需要的函数

步骤

1. 实现匹配服务端 C++

thrift -r --gen cpp match.thrift

会自动生成gen-cpp代码其中,xxx-skeleton.cpp实现服务端接口的示例代码

编译服务端

# 注意链接时应该加上-lthrift,链接系统库中的thrift动态链接库
g++ -o main main.cpp match_server/*.cpp -lthrift

2. 实现匹配客户端 Python

thrift -r --gen cpp match.thrift

会自动生成gen-py代码其中,Match-remote实现服务端接口的示例代码,但这里是实现客户端因此用不上,官网给了客户端实现的例子thrift-python-tutorial

3. 改进匹配服务端 V2.0

实现利用互斥锁和一般队列包装成消息队列通信,实现简单的生成者-消费者模型,其中unique_lock和条件变量condition_variable实现PV操作。

现在并没有涉及到数据库,只是将数据存储在内存中管理,并且匹配模式简单,用户池中相邻两个用户匹配,匹配后从池子中删除。

4. 实现数据保存客户端

官方C++客户端和服务端的样例,见thrift-cpp-tutorial

5. 改进匹配服务端 V3.0

改进匹配方式,现在为分差匹配,当池子中某两个用户分差50以内,匹配成功

6. 改进匹配服务端 V4.0

引入多线程实现的服务端,现在生产者-消费者模型的服务端是多线程,并且条件变量保证线程安全

官方给的服务器例子就是多线程的,对照修改代码即可,见thrift-cpp-tutorial的Server一条

7. 改进匹配服务端 V5.0

修改业务逻辑,按照等待时间扩大匹配范围,符合现实生活中的匹配逻辑

8. 简单实现数据存储服务端

注意应该使用同一份save.thrift(IDL代码)生成的代码文件,当然注释#不同是不会影响的。协议不一致的原因一定是IDL 中的接口定义或结构体字段顺序/类型不同,而不是注释。

  • 如果你不小心改了方法签名(参数类型、顺序、名字),即使是很小的变化,生成的代码就会不兼容,因为字段 ID 和名称会影响协议。
  • 同一个 .thrift 文件,如果生成代码的 命名空间 不一致(比如 namespace cpp save_service 改了),也可能导致客户端 include 的头文件和运行时解析不一致。
  • 客户端和服务端必须都重新用 同一份 .thrift 文件生成代码,不能一个用旧生成文件、一个用新生成文件。

PS:

为什么Python通常__name__ == "__main__"处理

区分脚本执行和模块导入

  • 每个 Python 模块都有一个内置变量 __name__,它表示模块的名字。

  • 当你直接运行一个 Python 文件时,__name__ 会被置为 "__main__"

  • 当这个文件被作为模块导入时,__name__ 就是模块的名字,而不是 "__main__"

Linux上可以使用工具得到md5值

md5sum 123456
# 回车,再ctrl + d结束回车

md5值有单向的特点,用明文能得到唯一的密文,而从密文几乎不可能还原为明文

关于git

git diff命令

# 查看工作区与暂存区对比
git diff

# 暂存区与上次提交(HEAD)对比
git diff --cached [文件名]

git报错

topeet@DESKTOP-J2H56AA ~/c/a/t/game-match (main)> git add readme.md
error: insufficient permission for adding an object to repository database .git/objects
error: readme.md: failed to insert into database
error: unable to index file 'readme.md'
fatal: updating files failed

# 可能是当前用户没有当前项目的所有权,可以修改
# 命令格式sudo chown [新所有者]:[新组] [文件/目录]
sudo chown -R topeet:topeet ./game-match/

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages