Python Thrift 简单示例

简介:

本文基于Thrift-0.10,使用Python实现服务器端,使用Java实现客户端,演示了Thrift RPC调用示例。Java客户端提供两个字符串参数,Python服务器端计算这两个字符串的相似度,并返回相似度结果(double类型,范围[0, 1],0表示不相似,1表示完全相同)

一,环境安装

开发环境:Windows10,PyCharm2016,Anaconda3,Python3.6

首先安装python 的thrift包:windows打开Anaconda prompt,输入:conda install -c anaconda thrift   安装thrift包。

输入:conda list 可查看系统中已经安装了哪些包,及包的版本,如下图所示:我们安装的是:thrift-0.10.0

在写代码之前,需要先定义一个 .thrift文件,然后使用Thrift Compiler生成相应的Thrift服务需要依赖的“文件”

①定义.thrift文件

namespace py similarityservice
namespace java similarityservice

service ChatSimilarityService{
    double similarity(1:string chat1, 2:string chat2),
}

namespace提供了一种组织代码的方式。其实就是,生成的文件放在:similarityservice这个文件夹下。

由于前面的Python安装的thrift-0.10,因此在官网上下载:thrift-0.10.exe,将它放在与 .thrift相同的目录下,cmd切换到该目录下,执行命令:

.\thrift-0.10.0.exe --gen py chat_similarity.thrift

生成的文件如下,将它们放在合适的python包下,即可供python 服务端程序 import 了。

 

二,Python服务端实现

pycharm thrift插件支持

可以去pycharm插件官网下载一个thrift插件,安装好之后,编写 .thrift 文件能够自动补全提示。

服务端的实现 主要有以下五方面:(个人理解,可能有错)

①Handler

服务端业务处理逻辑。这里就是业务代码,比如 计算两个字符串 相似度

②Processor

从Thrift框架 转移到 业务处理逻辑。因此是RPC调用,客户端要把 参数发送给服务端,而这一切由Thrift封装起来了,由Processor将收到的“数据”转交给业务逻辑去处理

③Protocol

数据的序列化与反序列化。客户端提供的是“字符串”,而数据传输是一个个的字节,因此会用到序列化与反序列化。

④Transport

传输层的数据传输。

⑤TServer

服务端的类型。服务器以何种方式来处理客户端请求,比如,一次Client请求创建一个新线程呢?还是使用线程池?……可参考:阻塞通信之Socket编程

TSimpleServer —— 单线程服务器端使用标准的阻塞式 I/O

TThreadPoolServer —— 多线程服务器端使用标准的阻塞式 I/O

TNonblockingServer —— 多线程服务器端使用非阻塞式 I/O

 

把上面生成的thrift文件复制到 thrift_service包下,如下图:

 

整个python 服务端的完整代码如下:

复制代码
 1 from thrift.protocol import TBinaryProtocol
 2 from thrift.server import TServer
 3 from thrift.transport import TSocket, TTransport
 4 
 5 from text.thrift_service.similarityservice import ChatSimilarityService
 6 
 7 from difflib import SequenceMatcher
 8 from pypinyin import pinyin
 9 import zhon
10 import pypinyin
11 from zhon.hanzi import punctuation
12 import re
13 
14 __HOST = '127.0.0.1'
15 __PORT = 9090
16 
17 
18 def similar_num(list1, list2):
19     return len(set(list1).intersection(list2))
20 
21 
22 def similar_ration(str1, str2):
23     return SequenceMatcher(lambda x: x == ' ', str1, str2).ratio()
24 
25 class SimilarityHandler(ChatSimilarityService.Iface):
26     def __init__(self):
27         self.log={}
28     def ping(selfs):
29         print('ping')
30 
31     def similarity(self, chat1, chat2):
32         #去掉中文字符串中的特殊标点符号
33         list1 = re.findall('[^{}]'.format(zhon.hanzi.punctuation), chat1)
34         list2 = re.findall('[^{}]'.format(zhon.hanzi.punctuation), chat2)
35 
36         #将标点符号转换成拼音
37         pinyin1 = pinyin(list1, style=pypinyin.STYLE_NORMAL)
38         pinyin2 = pinyin(list2, style=pypinyin.STYLE_NORMAL)
39 
40         #将所有的拼音统一保存到 单个list 中
41         pinyin_list1 = [word[0] for word in pinyin1]
42         pinyin_list2 = [word[0] for word in pinyin2]
43 
44         #计算 list 中元素相同的个数
45         result1 = similar_num(pinyin_list1, pinyin_list2)
46 
47         #list convert to string
48         str1_pinyin = ''.join(pinyin_list1)
49         str2_pinyin = ''.join(pinyin_list2)
50         #计算字符串的相似度
51         result2 = similar_ration(str1_pinyin, str2_pinyin)
52 
53         print('ratio:{}, nums:{}'.format(result2, result1))
54         return result2
55 
56 
57 if __name__ == '__main__':
58     handler = SimilarityHandler()
59     processor = ChatSimilarityService.Processor(handler)
60     transport = TSocket.TServerSocket(host=__HOST, port=__PORT)
61     tfactory = TTransport.TBufferedTransportFactory()
62     pfactory = TBinaryProtocol.TBinaryProtocolFactory()
63 
64     server = TServer.TThreadPoolServer(processor, transport, tfactory, pfactory)
65 
66     print('Starting the server')
67     server.serve()
68     print('done')
复制代码

这里简单地介绍下实现思路:

①使用python 的 zhon 包过滤掉中文中出现的标点符号等特殊字符

②python的 pypinyin 包 将中文转换成字符串(其实也可以直接比较中文字符串的相似度,但我这里转换成了拼音,就相当于比较英文字符串了)

③使用python 的 difflib 包中的SequenceMatcher 类来计算两个字符串之间的相似度

 

三,Java客户端实现

①在maven工程的pom.xml中添加thrift依赖。这里的libthrift版本、windows10下载的thrift compiler版本(thrift-0.10.0.exe),还有 python的 thrift包的版本 最好保持一致。

        <!-- https://mvnrepository.com/artifact/org.apache.thrift/libthrift -->
        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.10.0</version>
        </dependency>

②cmd命令行执行:.\thrift-0.10.0.exe --gen java chat_similarity.thrift  生成 ChatSimilarityService.java 文件,Java 客户端代码需要依赖它。

 

整个Java Client的代码如下:

复制代码
 1 import thrift.similarityservice.ChatSimilarityService;
 2 import org.apache.thrift.TException;
 3 import org.apache.thrift.protocol.TBinaryProtocol;
 4 import org.apache.thrift.protocol.TProtocol;
 5 import org.apache.thrift.transport.TSocket;
 6 import org.apache.thrift.transport.TTransport;
 7 
 8 /**
 9  * Created by Administrator on 2017/12/20.
10  */
11 public class SimilarityThriftClient {
12 
13     public static void main(String[] args) {
14         try {
15             TTransport transport;
16             transport = new TSocket("127.0.0.1", 9090);
17             transport.open();
18 
19             TProtocol protocol = new TBinaryProtocol(transport);
20             ChatSimilarityService.Client client = new ChatSimilarityService.Client(protocol);
本文转自hapjin博客园博客,原文链接:http://www.cnblogs.com/hapjin/p/8075721.html,如需转载请自行联系原作者

21             perform(client);
22             transport.close();
23 
24         } catch (TException e) {
25             e.printStackTrace();
26         }
27     }
28     private static void perform(ChatSimilarityService.Client client)throws TException {
29         String chat1 = "您好。";
30         String chat2 = "你好";
31         double ratio = client.similarity(chat1, chat2);
32         System.out.println(ratio);
33     }
34 }
复制代码

 

四,总结

本文介绍了一个简单的 Python Server、Java Client的Thrift服务调用示例。关于Thrift可参考:

Thrift Tutorial

Apache Thrift - 可伸缩的跨语言服务开发框架

Thrift 安装及使用

 

原文:Python Thrift 简单示例

相关文章
|
2月前
|
JSON API 数据格式
洋码头商品 API 示例指南(Python 实现)
洋码头是国内知名跨境电商平台,提供商品搜索、详情、分类等API接口。本文详解了使用Python调用这些API的流程与代码示例,涵盖签名生成、请求处理及常见问题解决方案,适用于构建选品工具、价格监控等跨境电商应用。
|
2月前
|
缓存 JSON API
VIN车辆识别码查询车五项 API 实践指南:让每一俩车有迹可循(Python代码示例)
VIN(车辆识别代码)是全球唯一的17位汽车标识码,可快速获取车架号、发动机号、品牌型号等核心信息。在二手车交易、保险理赔、维修保养等场景中,准确解析VIN有助于提升效率与风控能力。本文介绍VIN码结构、适用场景,并提供Python调用示例及优化建议,助力企业实现车辆信息自动化核验。
442 1
|
2月前
|
JSON API UED
运营商二要素验证 API:核验身份的一致性技术实践(Python示例)
随着线上业务快速发展,远程身份核验需求激增。运营商二要素验证API通过对接三大运营商实名数据,实现姓名、手机号、身份证号的一致性校验,具备权威性高、实时性强的优势,广泛应用于金融、电商、政务等领域。该接口支持高并发、低延迟调用,结合Python示例可快速集成,有效提升身份认证的安全性与效率。
255 0
|
2月前
|
JSON API 数据格式
Python采集京东商品评论API接口示例,json数据返回
下面是一个使用Python采集京东商品评论的完整示例,包括API请求、JSON数据解析
|
3月前
|
JSON 缓存 API
身份证二要素核验接口调用指南 —— Python 示例
本文介绍如何在 Python 中快速实现身份证二要素核验功能,适用于用户注册、金融风控等场景。通过阿里云市场提供的接口,可校验「姓名 + 身份证号」的一致性,并获取性别、生日、籍贯等信息。示例代码展示了从环境变量读取 APP_CODE、发送 GET 请求到解析 JSON 响应的完整流程。关键字段包括 code(1-一致,2-不一致,3-无记录)、msg 和 data。常见问题如 403 错误需检查 AppCode,超时则优化网络或设置重试机制。集成后可根据业务需求添加缓存、限流等功能提升性能。
335 4
|
2月前
|
测试技术 API 开发者
淘宝关键词搜索商品列表API接入指南(含Python示例)
淘宝关键词搜索商品列表API是淘宝开放平台的核心接口,支持通过关键词检索商品,适用于比价、选品、市场分析等场景。接口提供丰富的筛选与排序功能,返回结构化数据,含商品ID、标题、价格、销量等信息。开发者可使用Python调用,需注意频率限制与错误处理,建议先在沙箱环境测试。
|
6月前
|
XML JSON API
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
|
4月前
|
SQL 数据库 开发者
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
479 77
|
1月前
|
数据采集 索引 Python
Python Slice函数使用教程 - 详解与示例 | Python切片操作指南
Python中的`slice()`函数用于创建切片对象,以便对序列(如列表、字符串、元组)进行高效切片操作。它支持指定起始索引、结束索引和步长,提升代码可读性和灵活性。
|
2月前
|
JSON API 开发者
一号店商品 API 示例指南(Python 实现)
本教程介绍如何使用 Python 调用一号店商品 API,涵盖商品搜索、详情、分类等接口的调用方法。内容包括注册认证、签名生成、代码实现及常见问题解决方案,并提供完整示例代码,帮助开发者快速接入一号店开放平台,构建电商工具与数据分析应用。

热门文章

最新文章

推荐镜像

更多