Linux下跨語言調(diào)用C++實(shí)踐
發(fā)布日期:2022-05-07 18:49:37文章轉(zhuǎn)載自GitHub中文社區(qū) 作者: 林陽 朱超 識瀚
查詢理解(QU, Query Understanding)是美團(tuán)搜索的核心模塊,主要職責(zé)是理解用戶查詢,生成查詢意圖、成分、改寫等基礎(chǔ)信號,應(yīng)用于搜索的召回、排序、展示等多個環(huán)節(jié),對搜索基礎(chǔ)體驗(yàn)至關(guān)重要。該服務(wù)的線上主體程序基于C++語言開發(fā),服務(wù)中會加載大量的詞表數(shù)據(jù)、預(yù)估模型等,這些數(shù)據(jù)與模型的離線生產(chǎn)過程有很多文本解析能力需要與線上服務(wù)保持一致,從而保證效果層面的一致性,如文本歸一化、分詞等。
而這些離線生產(chǎn)過程通常用Python與Java實(shí)現(xiàn)。如果在線、離線用不同語言各自開發(fā)一份,則很難維持策略與效果上的統(tǒng)一。同時這些能力會有不斷的迭代,在這種動態(tài)場景下,不斷維護(hù)多語言版本的效果打平,給我們的日常迭代帶來了極大的成本。因此,我們嘗試通過跨語言調(diào)用動態(tài)鏈接庫的技術(shù)解決這個問題,即開發(fā)一次基于C++的so,通過不同語言的鏈接層封裝成不同語言的組件庫,并投入到對應(yīng)的生成過程。這種方案的優(yōu)勢非常明顯,主體的業(yè)務(wù)邏輯只需要開發(fā)一次,封裝層只需要極少量的代碼,主體業(yè)務(wù)迭代升級,其它語言幾乎不需要改動,只需要包含最新的動態(tài)鏈接庫,發(fā)布最新版本即可。同時C++作為更底層的語言,在很多場景下,它的計(jì)算效率更高,硬件資源利用率更高,也為我們帶來了一些性能上的優(yōu)勢。
本文對我們在實(shí)際生產(chǎn)中嘗試這一技術(shù)方案時,遇到的問題與一些實(shí)踐經(jīng)驗(yàn)做了完整的梳理,希望能為大家提供一些參考或幫助。
為了達(dá)到業(yè)務(wù)方開箱即用的目的,綜合考慮C++、Python、Java用戶的使用習(xí)慣,我們設(shè)計(jì)了如下的協(xié)作結(jié)構(gòu):
圖 1
Python、Java支持調(diào)用C接口,但不支持調(diào)用C++接口,因此對于C++語言實(shí)現(xiàn)的接口,必須轉(zhuǎn)換為C語言實(shí)現(xiàn)。為了不修改原始C++代碼,在C++接口上層用C語言進(jìn)行一次封裝,這部分代碼通常被稱為“膠水代碼”(Glue Code)。具體方案如下圖所示:
圖 2
聯(lián)系電話:
13528173451