thriftpy初體驗(yàn)

目前有這么一個(gè)需求:線上有很多個(gè)爬蟲(chóng)程序辑畦,它們?cè)跀?shù)據(jù)清洗完成后都要做文本情感分析眠屎。以往同學(xué)的做法是在每個(gè)爬蟲(chóng)中把相同代碼都Copy一份蕴轨,但是考慮到這樣會(huì)讓項(xiàng)目維護(hù)變得極其困難欠动,所以在重構(gòu)的使用考慮以基礎(chǔ)服務(wù)的方式提供情感分析模塊。thrift是Facebook開(kāi)源的一套跨語(yǔ)言服務(wù)調(diào)用RPC贾漏,用它便可以進(jìn)行某些功能模塊的服務(wù)化候学,thriftpy是餓了么開(kāi)源的thrift協(xié)議的純Python實(shí)現(xiàn)。由于它的使用更加符合Python的編碼習(xí)慣纵散,對(duì)Pythoneer更友好梳码,所以在剛接觸thrift的時(shí)候我選擇了后者。

thriftpyexample中伍掀,我們可以看到大量使用demo掰茶。首先我們來(lái)看一個(gè)最簡(jiǎn)單的例子pingpong

pingpong.thrift

service PingService {
    string ping(),
}

該文件的作用是描述服務(wù)接口,形式采用C語(yǔ)言的語(yǔ)法硕盹,所有基本類型(如上述文件的string)如下

bool:布爾類型(true or value)符匾,占一個(gè)字節(jié)
byte:有符號(hào)字節(jié)
i16:16位有符號(hào)整型
i32:32位有符號(hào)整型
i64:64位有符號(hào)整型
double:64位浮點(diǎn)數(shù)
string:未知編碼或者二進(jìn)制的字符串

比如,我定義一個(gè)需要帶參數(shù)的接口瘩例,就該這樣

service AargsPingService {
   string ping(1:string ping);
}

除了同步調(diào)用以外啊胶,還可以采用異步調(diào)用的方式,我們也需要在.thrift文件中進(jìn)行定義垛贤,比如我想定義一個(gè)異步調(diào)用焰坪,且返回內(nèi)容的方法

service Sleep {
    oneway void sleep(1: i32 seconds)
}

可以看到,我們加了關(guān)鍵詞oneway聘惦。

我們?cè)賮?lái)看看如何編寫(xiě)thriftpy的服務(wù)端代碼某饰,還是以最簡(jiǎn)單的ping為例進(jìn)行說(shuō)明
ping_server.py

# 導(dǎo)入thriftpy提供的接口
import thriftpy
from thriftpy.rpc import make_server
pp_thrift = thriftpy.load("pingpong.thrift", module_name="pp_thrift")

# 實(shí)現(xiàn).thrift文件定義的接口
class Dispatcher(object):
    def ping(self):
        print("ping pong!")
        return 'pong'

def main():
    # 定義監(jiān)聽(tīng)的端口和服務(wù)
    server = make_server(pp_thrift.PingService, Dispatcher(),
                         '127.0.0.1', 6000)
    print("serving...")
    server.serve()
if __name__ == '__main__':
    main()

如果我們要同時(shí)提供多個(gè)服務(wù)呢?比如PingServiceAargsPingService。這個(gè)時(shí)候需要建立多個(gè).thrift文件黔漂,可以參考multiplexer 诫尽。

我們?cè)賮?lái)看看客戶端代碼怎么寫(xiě)。
ping_client.py

import thriftpy
from thriftpy.rpc import client_context
# 讀入thrift文件炬守,module_name最好與server端保持一致牧嫉,也可以不保持一致
pp_thrift = thriftpy.load("pingpong.thrift", module_name="pp_thrift")
def main():
    with client_context(pp_thrift.PingService, '127.0.0.1', 6000) as c:
        pong = c.ping()
        print(pong)
if __name__ == '__main__':
    main()

如果一個(gè)服務(wù)比較耗時(shí),但是我們需要同步拿到返回結(jié)果减途,那么怎么辦酣藻?這個(gè)時(shí)候需要注意客戶端調(diào)用超時(shí)thriftpy的默認(rèn)超時(shí)時(shí)間是3秒鳍置,我們可以通過(guò)修改客戶端的socket_timeconnect_time來(lái)進(jìn)行設(shè)置

with client_context(pp_thrift.PingService, '127.0.0.1', 6000, socket_timeout=10 * 1000, connect_timeout=10*1000) as c:


此外辽剧,由于thriftpy默認(rèn)的server是單進(jìn)程的,為了充分利用CPU資源税产,eleme又開(kāi)源了一個(gè)多進(jìn)程的server gunicorn_thrift怕轿。需要單獨(dú)通過(guò)

pip install gunicorn_thrift

此外還需要注意一點(diǎn),在Python3中砖第,只支持 多進(jìn)程同步模型撤卢,也就是需要在gunicorn_config.py修改

worker_class = "thriftpy_gevent"

worker_class = "thriftpy_sync"。Python2中是支持協(xié)程的梧兼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市智听,隨后出現(xiàn)的幾起案子羽杰,更是在濱河造成了極大的恐慌,老刑警劉巖到推,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件考赛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡莉测,警方通過(guò)查閱死者的電腦和手機(jī)颜骤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捣卤,“玉大人忍抽,你說(shuō)我怎么就攤上這事《” “怎么了鸠项?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)子姜。 經(jīng)常有香客問(wèn)我祟绊,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任牧抽,我火速辦了婚禮嘉熊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扬舒。我一直安慰自己记舆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布呼巴。 她就那樣靜靜地躺著泽腮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衣赶。 梳的紋絲不亂的頭發(fā)上诊赊,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音府瞄,去河邊找鬼碧磅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遵馆,可吹牛的內(nèi)容都是我干的鲸郊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼货邓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秆撮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起换况,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤职辨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后戈二,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舒裤,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年觉吭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腾供。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲜滩,死狀恐怖伴鳖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绒北,我是刑警寧澤黎侈,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站闷游,受9級(jí)特大地震影響峻汉,放射性物質(zhì)發(fā)生泄漏贴汪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一休吠、第九天 我趴在偏房一處隱蔽的房頂上張望扳埂。 院中可真熱鬧,春花似錦瘤礁、人聲如沸阳懂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岩调。三九已至,卻和暖如春赡盘,著一層夾襖步出監(jiān)牢的瞬間号枕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工陨享, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葱淳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓抛姑,卻偏偏與公主長(zhǎng)得像赞厕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子定硝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容