當前位置:
首頁 > 最新 > RServe源代碼解析(下)

RServe源代碼解析(下)

本文通過對Rserve的設計初衷、運行機制、核心對象和方法進行粗淺探討,為利用Rserve做深度產品開發的開發者提供初始幫助。中篇介紹了伺服器端部分函數/方法邏輯,今天我們繼續介紹。

R

3 伺服器端主要函數/方法邏輯

3.5 Rserve_QAP1_connected()函數

Rserve_QAP1_connected()函數邏輯主線如下所示,1)Rserve_prepare_child為新連接創建新的進程,2)為新進程創建新的工作目錄,3)循環處理請求中的命令(command),將結果通過sendResp返回給客戶端(sendResp是一個宏定義,對應每個伺服器的sendResp指針函數)。

以CMD_eval、CMD_voidEval、CMD_detachedVoidEval為例,Command的處理過程包括1)CMD參數解碼,主要通過QAP_decode函數,2)表達式的R解析,調用R_tryEval等函數。

setup_workdir()為每個連接創建一個工作目錄(Unix下):在系統配置的workdir下,創建一個名為conn+進程ID(通過getpid()獲得)的子目錄。

函數Rserve_prepare_child調用RS_fork()為新連接生成新的進程。

Rserve用了大量的函數指針,很多封裝關係在靜態代碼分析工具圖中沒有體現出來,這也增加了源代碼閱讀的難度。

在上節standalone.c中,我們看到htttp服務創建後,有一條賦值fork函數的命令

看到RS_fork()就能明白其作用,RS_fork是fork_http、fork_https、fork_ws的封裝,為不同服務埠的連接生成新進程。

3.6 websokcets.c代碼

create_WS_server()邏輯比較直接,指定了服務各種消息的處理指針函數

WS_connected()函數的處理邏輯如下,1)Rserve_prepare_child生成新進程,2)與客戶端通訊握手(handshake),3)調用RSserv.c的Rserve_QAP1_connected()函數或 Rserve_text_connected()函數處理請求。

3.7 http.c代碼

create_HTTP_server()邏輯與websockets.c邏輯類似。但在新的連接請求處理時候,因為R本身提供了處理http請求的能力,所以HTTP_connected函數(更確切的說是process_request函數)主要利用了R內置函數httpd(url, query, body, headers)。

3.8 數據結構

結構體

作用

源文件

args

request/response信息傳遞對象

http.c

buffer

雙向鏈表

http.c

header_info

socket頭信息

websockets.c

iohdr_t

cmd和len信息

rsio.c

MD5Context

MD5使用

md5.h

phdr

QAP1消息的Header part

Rsrv.h、/proxy/qap.h

rs_eval

表達式的上下文和traceback信息

utils.c

rsio

讀寫狀態

rsio.c

rsmsg_t

父子進程間的通信內容

rsio.h

server

服務的基礎信息和各種回調函數

RSserver.h

server_stack

server的雙向鏈表

RSserver.c、/proxy/server.c

SHA1Context

SHA的上下文

sha1.c

sSession

session信息

session.h

R

4 客戶端

RServe提供了Java、C++、PHP等3個語言客戶端。

客戶端

文件

描述

Java client

src/client/java

對R的主要類型提供了封裝

C++ client

src/client/cxx

基本功能

PHP client

src/client/php

非常簡單的例子

Java客戶端相對豐富,在數據類型上支持String、Integer、Double、Logical、Language、Expression、Raw、Complex、Reference、Factor的Vector和List,但還沒有對dataframe等對象進行包裝,開源社區也有不少在此之上的補充(如Rsession、J2R)。

R

5 總結

RServe作為一個基於TCP/IP的R服務,為應用開發利用R的能力提供很大便利。為更放心的利用RServe的能力,本文簡敘RServe的基本處理邏輯,分析了其核心源代碼,期望能起到拋磚引玉的作用,更多熟悉操作系統的同事不斷提升其穩定性和計算性能。

作者:田春華

田春華博士,崑崙數據首席數據科學家,2004年1月清華大學自動化系博士畢業。2004年-2015年在IBM中國研究院,負責數據挖掘演算法研究和產品工作,在高端裝備、產品運維服務、新能源運營優化等多領域,幫助中國、亞太、歐美領先企業,成功實施資產管理、運營優化、營銷洞察等各類數據分析項目,為客戶創造上億美元收益。發表學術論文(長文)82篇(其中第一作者42篇),擁有36項專利申請(10項已授權)。研究興趣:數據挖掘演算法與應用。

參考文獻

1. 張丹. R的極客理想:工具篇,2014,機械工業出版社

2. Simon Urbanek. A Fast Way to Provide R Functionality to Applications, Proceedings of the 3rd International Workshop on Distributed Statistical Computing (DSC 2003), March 20–22, Vienna, Austria

Simon Urbanek

2. https://cran.r-project.org/doc/manuals/R-ints.html

3. https://cran.r-project.org/doc/manuals/R-exts.html

4. Elliotte Rusty Harold,Java網路編程, O Reilly Media Inc.、中國電力出版社, 2013.

5. W.Richard Stevens,Bill Fenner,Andrew M. Rudoff. UNIX網路編程 卷1 套接字聯網API(第3版),北京郵電出版社

6. http://www.rforge.net/Rserve/doc.html

7. http://www.rforge.net/Rserve/dev.html


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 崑崙數據K2Data 的精彩文章:

TAG:崑崙數據K2Data |

您可能感興趣

RequireJS框架源代碼解析
Drill-on-YARN之源碼解析
Google的開源Consent解決方案解析APUS研究院
AtomicInteger 源碼解析
Marvell第二代ARM處理器ThunderX2解析:不遜Intel至強
導演 Sing J. Lee 解析 Migos 新歌《Stir Fry》 MV 拍攝靈感
Service Mesh 及其主流開源實現解析
Android項目解耦-路由框架ARouter源碼解析
精讀解析 《When Sophie Gets Angry》
解析.DS_Store文件格式
android 訪問webservice(解析一行代碼實現)
Spring源碼解析——Spring思想、設計模式總結
Siemens MPI協議解析
Istio技術與實踐02:源碼解析之Istio on Kubernetes 統一服務發現
《Fighting EX Layer》PC版將支持4K解析度
FutureTask 在線程池中應用和源碼解析
網關 Spring-Cloud-Gateway 源碼解析——路由之RouteDefinitionLocator一覽
視覺中國官網vcg.com域名狀態變為clientHold(暫停解析)
Word2v的ec 原理解析!
Moto E5 Play Android Go手機發布:真上古解析度