http://www.tuicool.com/articles/vuymei

不知道为什么就看了cowboy代码,就继续看了下去了。

分析一下吧,主要写写cowboy 的acceptor pool 的实现

cowboy的源码比mochiweb的更简洁, acceptor pool是通用的,cowboy提供了tcp的协议实现。而应用层协议也是通用的,cowboy提供了http协议的实现。

一、循例分析一下 cowboy 的线程树结构,从它启动的。入手 (现在先列出来cowboy启动的流程,等下说工作流程时候再串联起来。 )

想用appmon和observer截图cowboy 的线程树了。但是不太好看,太多了。(主要是创建的acceptor线程太多)。我就文字说说吧。

application:start(crypto),
application:start(public_key),
application:start(ssl),
application:start(cowboy).

之后会创建一个cowboy_clock的worker。 同时根据配置文件,去选择要不要启动eprof来统计执行时间。

然后application的启动就结束了,然后到启动listener的代码。如下

Dispatch = [
{'_', [
{[<<"websocket">>], websocket_handler, []},
{[<<"eventsource">>], eventsource_handler, []},
{[<<"eventsource">>, <<"live">>], eventsource_emitter, []},
{'_', default_handler, []}
]}
],
cowboy:start_listener(my_http_listener, 100,
cowboy_tcp_transport, [{port, 8080}],
cowboy_http_protocol, [{dispatch, Dispatch}]
).

这次就依照tcp的连接池和http的应用层协议来讲吧

cowboy:start_listener  其实就做了一件事, 把cowboy_listener_sup  作为supervisor 动态添加到cowboy_sup下

然后cowboy_listener_sup 会创建三个子线程,cowboy_listener 是worker ,还有cowboy_requests_sup是supervisor , cowboy_acceptors_sup也是supervisor

cowboy_listener 用了gen_server模式,这个文件是实现了连接池的算法。

cowboy_requests_sup 是声明了 simple_one_for_one 。 顾名思义,这文件是响应请求的worker线程的supervisor。    (插话说simple_one_for_one 使用最经典场景就是网络编程中新建工作线程来处理请求了。)

cowboy_acceptor_sup 会有两个动作

调用cowboy_tcp_transport:listen,里面其实就是调用gen_tcp:listen

创建一堆cowboy_acceptor 的worker 线程

启动就到这里了。现在开始说它的工作流程。

二、cowboy acceptor pool工作模式

 

cowboy_acceptor 文件:

初始化时候,cowboy_acceptor是创建线程来监听accept

cowboy_acceptor 的工作步骤有几个:

1),调用gen_tcp:accept ,默认是2秒超时

2),假如超时后,他会坚持配置参数是否更新了,然后再重新监听

3)如果accept到有信息,它就会在cowboy_request_sup下面创建worker

cowboy_request 线程会调用指定的协议处理文件。 
    这时候会跳转到对应的http协议实现里面去处理这个请求。(这里我不跟进去了)

4)调用绑定socket和pid 的controlling_process()

5)调用cowboy_listener:add_connection 来更新连接池里面的动态。

cowboy_listener 所维护的池是怎样工作的呢?我们继续看下去。

首先会调用add_pid ,里面做了几件事

首先会monitor创建的request工作线程

然后发一个 shoot信息过去,确认socket的控制权给到了http协议。

然后池内连接数加1.再存到ets里面。

add_pid之后它会对比使用的配置是否更新了

代码很浅白,我想说的是, queue:in 那里,它会吧这个记录保存在一个队列里面。为什么这样做呢? 在remove_connecttion时候就会用到

当工作做完,要断开连接时候,cowboy_listener是这样工作的:

调用remove_pid

从ets里面取出池状态

移除monitor

连接数+1

然后 queue:out出来,通知 http协议可以socket控制权已经移交回来。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

这次是后记,描述得不是很好,而且功夫还未到家。见笑了。下次写cowboy的协议扩展。

all  by dp~~

【erlang 网络编程学习】 分析cowboy acceptor实现的更多相关文章

  1. C,C++网络编程学习简明指南

    C,C++网络编程学习简明指南 1. 扎实的C,C++基础知识 参考资料<C程序设计>,<C++ primer>. 2. TCP/IP协议 经典书是:W.Richard Ste ...

  2. [转]Windows网络编程学习-面向连接的编程方式

    直接附上原文链接:windows 网络编程学习-面向连接的编程方式

  3. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  4. Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

    最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...

  5. Linux C++ 网络编程学习系列(1)——端口复用实现

    Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...

  6. Linux网络编程案例分析

    本代码来自于博主:辉夜星辰 本篇主要对运行代码中出现的问题进行分析,代码本身的内容后续展开讨论. 服务器端代码 /* Linux网络编程之TCP编程,服务器端读数据 socket函数之后,返回值ser ...

  7. Java 网络编程学习总结

    新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1]    网络编程认识                [2]  TCP/IP编程 ...

  8. Qt 多线程和网络编程学习

    一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...

  9. python网络编程学习《一》

    最近,刚实习完,很喜欢实验楼,但是自己的方向仍然不能确定,自己觉得可选择的空间很大,尽管已经是大四的人了,想到别人都在忙着买职业装,买高跟鞋面试,学习化妆什么的,看看自己,反而开始慢慢关注运动,食疗以 ...

随机推荐

  1. 微信支付v2开发(11) Native支付

    关键字:微信公众平台 微信支付 Native原生支付 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/wxpay-native.html 在这篇微信公众平台开 ...

  2. Java Web学习总结(4)——HttpServletResponse对象入门

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应,那我们 ...

  3. 将Maven的Java Project转换或修改为Web Project

    将Maven的Java  Project转换为Web Project关键是需要了解Eclipse和MyEclipse的工程中如下文件.classpath..project. .mymetadata和s ...

  4. 2.JPA学习总结

    转自:https://shmilyaw-hotmail-com.iteye.com/blog/1969190 前言 最近在做一个项目的时候因为牵涉到要对数据库的操作,在最开始实现的时候采用了直接的JD ...

  5. Android 一个异步SocketHelper

    发送流程:首先定义一个缓冲池,发送数据时仅仅是将待发送的数据加入到缓冲池中,再由后台的工作线程从缓冲池中取得待发送数据进行发送.可能某些情况下在数据发送完成时需要做一些处理(比如写日志),便定义了一个 ...

  6. [转]MySQLHelper类

    本文转自:http://de.cel.blog.163.com/blog/static/5145123620110181003903/ 类似于SQLHelper,只是这里引用的是MySql.Data类 ...

  7. [Android5.1]ActivityManagerService启动过程分析

    ActivityManagerService(简称AMS)是Android系统的关键服务之中的一个.它的主要作用例如以下: 管理系统中全部应用进程的整个生命周期 管理应用进程中的Activity.Se ...

  8. ldd 查看程序/动态库 的依赖

    今天在帮同事查看一个问题时, 需要用到ldd, 于是就顺便看了一下ldd的实现. 好在ldd本身只是一个脚本, 而不是executable, 可以直接查看实现的代码. 根据注释: 21 # This ...

  9. FeatureLayer,FeatureDataset,FeatureClass,Feature的区别与联系总结

    duckweeds原文 FeatureLayer,FeatureDataset,FeatureClass,Feature几个概念一点点总结,欢迎指教 刚学AE,其中很多概念都模糊不清.经过一段时间的摸 ...

  10. 观CSDN站点小Bug有感

            今天早上在浏览博客的时候偶然发现CSDN博客的数据出现了异常,我也是头一次看到这么明显的Bug.详细什么表现呢?先来看个截图.例如以下:             常常看CSDN博客的人 ...