mochiweb 源碼閱讀(十一)

  大家好,今天周六,繼續接著上一篇,跟大家分享mochiweb源碼。上一篇,最后我們看到了mochiweb_socket_server:listen/3函數:

listen(Port, Opts, State=#mochiweb_socket_server{ssl=Ssl, ssl_opts=SslOpts}) ->case mochiweb_socket:listen(Ssl, Port, Opts, SslOpts) of{ok, Listen} ->{ok, ListenPort} = mochiweb_socket:port(Listen),{ok, new_acceptor_pool(Listen,State#mochiweb_socket_server{listen=Listen,port=ListenPort})};{error, Reason} ->{stop, Reason}end.

  我們看下最后一行調用mochiweb_socket_server:new_acceptor_pool/2函數,并且返回{ok, 該函數的返回結果},該函數完整代碼如下:

new_acceptor_pool(Listen,State=#mochiweb_socket_server{acceptor_pool=Pool,acceptor_pool_size=Size,loop=Loop}) ->F = fun (_, S) ->Pid = mochiweb_acceptor:start_link(self(), Listen, Loop),sets:add_element(Pid, S)end,Pool1 = lists:foldl(F, Pool, lists:seq(1, Size)),State#mochiweb_socket_server{acceptor_pool=Pool1}.

  這個函數,首先定義匿名函數F,這個匿名函數,接受2個參數,其中第一個參數丟棄了,另一個參數為S;接著我們看下第一行,調用mochiweb_acceptor:start_link/3函數,并返回進程標識Pid,接著調用系統函數 sets:add_element/2,我們先看下這個系統函數,erlang doc 地址:http://www.erlang.org/doc/man/sets.html#add_element-2,如下圖:

  返回一個新的set由Set1插入Element形成。

  好了,弄清楚匿名函數的邏輯,這里我們先不關注mochiweb_acceptor:start_link/3函數具體內部邏輯,現在只要知道它會返回一個進程標識符就可以了。

  我們繼續往下看:

Pool1 = lists:foldl(F, Pool, lists:seq(1, Size)),

  這里首先調用lists:seq/2函數,產生1到Size的列表。這里:acceptor_pool_size=Size=16,取的是mochiweb_socket_server記錄acceptor_pool_size字段的默認值。然后依次對這個列表調用匿名函數F,并傳遞列表中的元素值,以及Pool變量,這里:acceptor_pool=Pool=sets:new(),這里也是取的mochiweb_socket_server記錄acceptor_pool字段的默認值。注意:之前匿名函數F的第一個參數為丟棄的值:_,表示這里并不需要這個元素的值,只是循環調用這個匿名函數Size次,并且每次都是在之前的set基礎上增加新的Element,并返回。

  最后把State#mochiweb_socket_server字段acceptor_pool的值修改為返回的最新的set類型的變量Pool1。

  好了,到目前為止,我們已經弄明白了new_acceptor_pool函數,回過頭來,我們看下之前沒有詳細看的mochiweb_acceptor:start_link/3函數:  

start_link(Server, Listen, Loop) ->proc_lib:spawn_link(?MODULE, init, [Server, Listen, Loop]).

  這個函數很簡單,就一行邏輯,調用系統函數:proc_lib:spawn_link/3,erlang doc 地址:http://www.erlang.org/doc/man/proc_lib.html#spawn_link-3,如下圖:

  這個函數的作用和erlang模塊下的spawn_link功能類似,都是初始化一個進程來執行指定模塊下的指定函數。關于用proc_lib創建的進程有什么與眾不同,這里不打算多說,大家可以參考堅強2002同學的,這篇文章:[Erlang 0017]Erlang/OTP基礎模塊 proc_lib。

?  接下來我們就可以看下mochiweb_acceptor:init/3函數,完整代碼如下:

init(Server, Listen, Loop) ->T1 = now(),case catch mochiweb_socket:accept(Listen) of{ok, Socket} ->gen_server:cast(Server, {accepted, self(), timer:now_diff(now(), T1)}),call_loop(Loop, Socket);{error, closed} ->exit(normal);{error, timeout} ->init(Server, Listen, Loop);{error, esslaccept} ->exit(normal);Other ->error_logger:error_report([{application, mochiweb},"Accept failed error",lists:flatten(io_lib:format("~p", [Other]))]),exit({error, accept_failed})end.

  接下來,我們來詳細看下這個函數的具體邏輯:

T1 = now()

  這一行,調用系統函數erlang:now/0,erlang doc 地址:http://www.erlang.org/doc/man/erlang.html#now-0,如下圖:

  測試如下:

  

  好了,這一篇就到這里,下一篇,我們將從mochiweb_socket:accept/1繼續往下看。

  最后,謝謝大家的支持,晚安。

轉載于:https://www.cnblogs.com/yourihua/archive/2012/07/29/2613692.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377304.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377304.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377304.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android下拉刷新完全解析,教你如何一分鐘實現下拉刷新功能 (轉)

轉載請注明出處:http://blog.csdn.net/guolin_blog/article/details/9255575 最 近項目中需要用到ListView下拉刷新的功能,一開始想圖省事,在網上直接找一個現成的,可是嘗試了網上多個版本的下拉刷新之后發現效果都不怎么理 想。有…

Python中的append()和extend()

列出append()方法 (List append() method) append() method is used to insert an element or a list object to the list and length of the List increased by the 1. append()方法用于將元素或列表對象插入列表,并且列表長度增加1。 Syntax: 句法: …

紅黑樹的實現

目錄1、紅黑樹原理1、紅黑樹性質2、變換規則(從插入結點的角度來講)1.變色2.左旋3.右旋3、刪除結點需要注意的地方2、代碼1、定義結點以及構造函數2、定義紅黑樹類以及聲明它的方法3、左旋4、右旋5、插入操作6、修正操作7、刪除操作3、參考鏈接1、紅黑樹…

118 - ZOJ Monthly, July 2012

http://acm.zju.edu.cn/onlinejudge/showContestProblems.do?contestId339 都是賽后做的。。。弱爆了 A題是找由2和5組成的數字的個數 直接打個表就行了 只是比賽的時候不知道怎么打表啊。。 View Code #include<cstdio> #include<cstring> #include<algorith…

edp1.2和edp1.4_EDP??的完整形式是什么?

edp1.2和edp1.4EDP??&#xff1a;電子數據處理 (EDP: Electronic Data Processing) EDP is an abbreviation of Electronic Data Processing. It alludes to the functioning of operations of commercial data, documents processing of storing, with the use of a compute…

高效讀書心得

1.盡量閱讀中文版 雖然有人英文很強&#xff0c;有的翻譯很差&#xff0c;但AnyWay 中文閱讀與理解的時間&#xff0c;略讀與快速定位感興趣內容的速度還是要快一些。 2.即時批注、總結筆記與交流 雖然愛書&#xff0c;但發現最有效的讀書方式還是不斷的制造脂批本&…

《MySQL——增刪改查以及常用語法》

目錄登錄和退出MySQL服務器基本語法&#xff08;增刪改查&#xff09;登錄和退出MySQL服務器 # 登錄MySQL 密碼 $ mysql -u root -p12345612 # 退出MySQL數據庫服務器 exit;基本語法&#xff08;增刪改查&#xff09; -- 顯示所有數據庫 show databases;-- 創建數據庫 CREA…

WCF簡介

一、簡介 WCF是Windows Communication Foundation縮寫&#xff0c;是Microsoft為構建面向服務的應用提供的分布式通信編程框架&#xff0c;是.NET Framework 3.5的重要組成部分。使用該框架&#xff0c;開發人員可以構建跨平臺、安全、可靠和支持事務處理的企業級互聯應用解決方…

css鏈接樣式_CSS中的樣式鏈接

css鏈接樣式CSS樣式鏈接 (CSS Styling Links) The links in CSS can be styled in various ways to make our website more presentable and attractive. The links can also be styled depending on their states e.g. visited, active, hover, etc. CSS中的鏈接可以通過各種方…

《MySQL——約束》

目錄主鍵約束唯一主鍵非空約束默認約束外鍵約束主鍵約束 -- 主鍵約束 -- 使某個字段不重復且不得為空&#xff0c;確保表內所有數據的唯一性。 CREATE TABLE user (id INT PRIMARY KEY,name VARCHAR(20) );-- 聯合主鍵 -- 聯合主鍵中的每個字段都不能為空&#xff0c;并且加起…

UIControl事件

CHENYILONG BlogUIControl事件 FullscreenUIControl事件1.UIControlEventTouchDown單點觸摸按下事件&#xff1a;用戶點觸屏幕&#xff0c;或者又有新手指落下的時候。2.UIControlEventTouchDownRepeat多點觸摸按下事件&#xff0c;點觸計數大于1&#xff1a;用戶按下第二、三、…

C++ 為什么要使用#ifdef __cplusplus extern C { #endif

經常看到別人的頭文件 有這樣的代碼 #ifdef __cplusplus extern "C" { #endif// C 樣式 的函數#ifdef __cplusplus } #endif 為什么要這樣呢&#xff1f; 因為 C 語言不支持重載函數 也就是同名函數&#xff0c;參數卻不一樣,C支持&#xff0c;其編譯器對函數名的處理…

css中的媒體查詢_CSS中的媒體查詢

css中的媒體查詢CSS | 媒體查詢 (CSS | Media Queries) Creating a web page is not an easy task as it requires loads of content and data so that it becomes strongly responsive to the users. To do that various contents are even added e.g.: resources, informativ…

SharePoint2013安裝組件時AppFabric時出現1603錯誤,解決方法:

采用PowerShell命令批量下載必備組件: 下載完成后&#xff0c;采用批處理命令安裝必備組件。 注&#xff1a;SPS2013安裝必備組件及批處理下載地址&#xff1a; 需要將必備組件放在安裝文件的PrerequisiteInstallerFiles文件夾中&#xff0c;將PreReq2013.bat放在安裝文件根目錄…

《MySQL——數據表設計三大范式》

目錄數據表設計范式第一范式第二范式第三范式數據表設計范式 第一范式 數據表中的所有字段都是不可分割的原子值。 字段值還可以繼續拆分的&#xff0c;就不滿足第一范式&#xff0c;如下&#xff1a; 下面這個&#xff0c;更加貼合第一范式&#xff1a; 范式設計得越詳細&…

三道簡單樹型dp+01背包~~hdu1561,poj1947,zoj3626

以前學樹型dp就是隨便的看了幾道題&#xff0c;沒有特別注意樹型dp中的小分類的總結&#xff0c;直到上次浙大月賽一道很簡單的樹型dp都不會&#xff0c;才意識到自己太水了&#xff5e;&#xff5e;come on&#xff01; hdu1561&#xff1a;題目給出了很多棵有根樹&#xff0c…

css 字體圖標更改顏色_在CSS中更改字體

css 字體圖標更改顏色CSS字體屬性 (CSS font properties ) Font properties in CSS is used to define the font family, boldness, size, and the style of a text. CSS中的字體屬性用于定義字體系列 &#xff0c; 粗體 &#xff0c; 大小和文本樣式 。 Syntax: 句法&#xf…

深入new/delete:Operator new的全局重載

Operator new 的全局重載 原文地址&#xff1a;http://blog.csdn.net/zhenjing/article/details/4354880 我們經常看到這么一句話&#xff1a; operator new 可以重載&#xff0c; placement new 不可重載。其實此處所說的不可重載應該是指全局的 placement new 不可重載&#…

C++基礎知識點整理

基本語法 1、static關鍵字的作用 1、全局靜態變量 加了static關鍵字的全局變量只能在本文件中使用。 存儲在靜態存儲區&#xff0c;整個程序運行期間都存在。 2、局部靜態變量 作用域仍為局部作用域。 不過離開作用域之后&#xff0c;并沒有銷毀&#xff0c;而是貯存程序中&a…

Haskell學習筆記

《learn you a Haskell》這書的結構與常見的語言入門教材完全不一樣。事實上&#xff0c;即使學到第八章&#xff0c;你還是寫不出正常的程序…因為到現在為止還沒告訴你入口點模塊怎么寫&#xff0c;IO部分也留在了最后幾章才介紹。最重要的是&#xff0c;沒有系統的總結數據類…