本文基于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 similarityserviceservice 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);
,如需转载请自行联系原作者
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 简单示例

Python Thrift 简单示例相关推荐

  1. python多线程简单示例

    一.QThread QThread 只介绍继承的方法 1.把线程需要实现的内容放在run函数里,建立Qthread对象调用start()函数,开辟新线程并且运行.当run函数执行完毕后线程退出. fr ...

  2. python爬虫简单示例_最简单爬虫示例(入门级)

    [实例简介] [实例截图] [核心代码] from lxml import etree import requests def handle_request(url): heades = { 'Use ...

  3. python画环形图_Python通过matplotlib画双层饼图及环形图简单示例

    摘要:这篇Python开发技术栏目下的"Python通过matplotlib画双层饼图及环形图简单示例",介绍的技术点是"matplotlib.Python.简单示例.饼 ...

  4. Thrift的安装和简单示例

    本文只是简单的讲解Thrift开源框架的安装和简单使用示例,对于详细的讲解,后面在进行阐述. Thrift简述 Thrift是一款由Fackbook开发的可伸缩.跨语言的服务开发框架,该框架已经开源并 ...

  5. python文本处理实例_Python 文件处理的简单示例

    这篇文章主要为大家详细介绍了Python 文件处理的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 相关的AP ...

  6. python获取mac、计算机id_python 获取本机IP、mac地址、计算机名的简单示例

    这篇文章主要为大家详细介绍了python 获取本机IP.mac地址.计算机名的简单示例,具有一定的参考价值,可以用来参考一下. 对python获取本机IP.mac地址.计算机名感兴趣的小伙伴,下面一起 ...

  7. python简单单元测试示范卷_Python 单元测试的简单示例

    这篇文章主要为大家详细介绍了Python 单元测试的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 以前我是不 ...

  8. python二分法求解_Python使用二分法求平方根的简单示例

    这篇文章主要为大家详细介绍了Python使用二分法求平方根的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 使 ...

  9. python 搭建的http 动态服务器_Python 创建HTTP服务器的简单示例

    这篇文章主要为大家详细介绍了Python 创建HTTP服务器的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! ...

  10. python简单装饰器_python装饰器的简单示例

    这篇文章主要为大家详细介绍了python装饰器的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 装饰器的语法以 ...

最新文章

  1. php 发出get与post请求
  2. 笔记-知识产权与标准化知识-GB/T-12504-1990计算机软件质量保证计划规范
  3. 使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试
  4. python中文件读取操作及注意事项
  5. jQuery模板和数据绑定
  6. oracle 提示存在lob,Oracle数据库出现ORA-19566 LOB坏块的处理记录
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的bbs论坛管理系统
  8. 华为指标OceanStore
  9. mysql数据库学习——5,数据类型,字符集和校对
  10. ESP8266 WiFi模块和单片机,电脑连接
  11. 隐马尔可夫python_隐马尔可夫模型原理和python实现
  12. PS2 键盘 变 USB 键盘 设计图
  13. Django批量修改 get_field_display foreignkey
  14. 《Web API 的设计与开发》读书笔记
  15. java如何在控制台重定向_R - 控制台输出重定向不能(可靠地)从函数调用中工作...
  16. 软件工程师解决测试人员测试出的bug流程
  17. 当滑雪这项世界最古老的运动遇上AI
  18. xxl-job调度执行器的端口被外部频繁访问造成的错误
  19. 浅谈百度闪电算法以及网站HTTPS(图文)
  20. “沙箱机制”是什么?

热门文章

  1. cad没有命令输入框_cad中怎么输入文字?cad怎么输入文字?
  2. 解决嵌套块级元素垂直外边距的塌陷
  3. oracle中print,oracle中print_table存储过程实例介绍
  4. Git 本地分支关联远程分支
  5. 六石管理学:考评不要与自己为难
  6. JDK GUI对应的c文件
  7. JAVA RSA加密解密代码范例(byte[]版)
  8. 从概率观点,怎样看新冠病毒的疫情
  9. 公司买网络设备,至少16口
  10. “一沙一世界”的感悟