• ranch分析学习(三)


    接着上一篇继续研究

    上一篇结尾的时候,我们谈到了连接,监听两个监督树,今天我们就来看看这两个监督树和他们的工作者都是干什么的,怎么实现的。文件编号接上篇。

    6. ranch_acceptors_sup.erl 

     1 -module(ranch_acceptors_sup).
     2 -behaviour(supervisor).
     3 
     4 -export([start_link/4]).
     5 -export([init/1]).
     6 
     7 -spec start_link(ranch:ref(), non_neg_integer(), module(), any())
     8     -> {ok, pid()}.
     9 start_link(Ref, NbAcceptors, Transport, TransOpts) ->
    10     supervisor:start_link(?MODULE, [Ref, NbAcceptors, Transport, TransOpts]).
    11 
    12 init([Ref, NbAcceptors, Transport, TransOpts]) ->
    13     ConnsSup = ranch_server:get_connections_sup(Ref),
    14     LSocket = case proplists:get_value(socket, TransOpts) of
    15         undefined ->
    16             {ok, Socket} = Transport:listen(TransOpts),
    17             Socket;
    18         Socket ->
    19             Socket
    20     end,
    21     {ok, {_, Port}} = Transport:sockname(LSocket),
    22     ranch_server:set_port(Ref, Port),
    23     Procs = [
    24         {{acceptor, self(), N}, {ranch_acceptor, start_link, [
    25             LSocket, Transport, ConnsSup
    26         ]}, permanent, brutal_kill, worker, []}
    27             || N <- lists:seq(1, NbAcceptors)],
    28     {ok, {{one_for_one, 10, 10}, Procs}}.
    View Code

    这个文件我主要来看看在 init 里面都干了些什么事情。主要是给监听连接进程设置参数,然后生成多个子进程做连接监听处理。整个文件看过otp设计规范的不难理解明白。

    在看下一个文件前,请大家移步到这里详细了解 proc_lib 否则有些地方可能看不明白。

    7.ranch_conns_sup.erl

       这个文件虽然也是在监督树下面的工作者,但是并没采用gen_server回调模块实现。那假设我们要实现类似的功能,我要实现那些函数呢这个其实没有严格的限制 在我们设置监督树子进程的时候配置对应的参数都是都可以的。这样文字说明可能不清楚,我结合代码具体的说明。

    Procs = [
            {{acceptor, self(), N}, {ranch_acceptor, start_link, [
                LSocket, Transport, ConnsSup
            ]}, permanent, brutal_kill, worker, []}
                || N <- lists:seq(1, NbAcceptors)],

    大家请看上面的代码中的 start_link,这个就是子进程启动的入口,子进程必须要导出这个函数,后[LSocket, Transport, ConnsSup]  这个是 前面start_link 接收的参数。 自己编码实现子进程的时候我们可以起名为任意名称,只要在设置进程规范的和导出的初始函数对应就行。当然为了统一好理解好事 起名start_link看起来更加的规范。导出函数的返回还是有严格规定的,启动成功必须返回{ok,pid}.否则整个就会启动失败的。当然如果你要标新立异在gen_server启动的时候 start_link你也可以改名。

  • 相关阅读:
    Glide加载网络图片与本地图片尺寸不一致
    android BLE 40 setCharacteristicNotification接收不到数据
    Android中颜色透明度对应16进制值
    模拟器不能运行 Failed to start emulator: Cannot run program "/home/kroaity/Downloads/android-sdk-linux//tools/emulator": error=2
    android SDK Manager 代理服务器设置
    if the parser found inconsistent certificates on the files in the .apk.104
    win7自带桌面便签
    unable to connect to the virtual device Genymotion 神器启动问题
    ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
    获得root权限system/app下文件无法删除
  • 原文地址:https://www.cnblogs.com/codew/p/3837414.html
Copyright © 2020-2023  润新知