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.mzph.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;没有系统的总结数据类…