基本步骤
- 定义接口
- 实现server
- 实现client
thrift官方给了类似C++的IDL文件示例(文件后缀为.thrift),地址为tutorial.thirt
- 划分相应的命名空间
- 定义相关的数据类型
- 定义需要的函数
thrift -r --gen cpp match.thrift会自动生成gen-cpp代码其中,xxx-skeleton.cpp是实现服务端接口的示例代码
编译服务端
# 注意链接时应该加上-lthrift,链接系统库中的thrift动态链接库
g++ -o main main.cpp match_server/*.cpp -lthriftthrift -r --gen cpp match.thrift会自动生成gen-py代码其中,Match-remote是实现服务端接口的示例代码,但这里是实现客户端因此用不上,官网给了客户端实现的例子thrift-python-tutorial
实现利用互斥锁和一般队列包装成消息队列通信,实现简单的生成者-消费者模型,其中unique_lock和条件变量condition_variable实现PV操作。
现在并没有涉及到数据库,只是将数据存储在内存中管理,并且匹配模式简单,用户池中相邻两个用户匹配,匹配后从池子中删除。
官方C++客户端和服务端的样例,见thrift-cpp-tutorial
改进匹配方式,现在为分差匹配,当池子中某两个用户分差50以内,匹配成功
引入多线程实现的服务端,现在生产者-消费者模型的服务端是多线程,并且条件变量保证线程安全
官方给的服务器例子就是多线程的,对照修改代码即可,见thrift-cpp-tutorial的Server一条
修改业务逻辑,按照等待时间扩大匹配范围,符合现实生活中的匹配逻辑
注意应该使用同一份save.thrift(IDL代码)生成的代码文件,当然注释#不同是不会影响的。协议不一致的原因一定是IDL 中的接口定义或结构体字段顺序/类型不同,而不是注释。
- 如果你不小心改了方法签名(参数类型、顺序、名字),即使是很小的变化,生成的代码就会不兼容,因为字段 ID 和名称会影响协议。
- 同一个
.thrift文件,如果生成代码的 命名空间 不一致(比如namespace cpp save_service改了),也可能导致客户端 include 的头文件和运行时解析不一致。 - 客户端和服务端必须都重新用 同一份
.thrift文件生成代码,不能一个用旧生成文件、一个用新生成文件。
区分脚本执行和模块导入
-
每个 Python 模块都有一个内置变量
__name__,它表示模块的名字。 -
当你直接运行一个 Python 文件时,
__name__会被置为"__main__"。 -
当这个文件被作为模块导入时,
__name__就是模块的名字,而不是"__main__"。
md5sum 123456
# 回车,再ctrl + d结束回车md5值有单向的特点,用明文能得到唯一的密文,而从密文几乎不可能还原为明文
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/