看了erlang的一些开源网络框架RabbitMQ、Ranch。他们都使用多个进程同一时候accept一个socket。

这样的方式在使得socketport监听的工作分担了很多其它的调度机会。可是,在erlang中,socket接受一个新连接后,假设想让还有一个进程处理消息,就要显式的调用gen_tcp:controlling_process(Socket, Pid)。

所以问题来了,erlang多个进程同一时候监听一个socket安全吗?

这样的方式在早期的erlang是不安全的,但R11B03 版本号之后,erlang做了改进,同意多个进程同一时候监听同一个socket。

erlang R11B03 更新日志

OTP-6416 gen_tcp now allows for several processes to issue accept calls to the same listen-socket simultaniously. The different accepting processes will get connected sockets on a first-come-first-served basis.

当多个进程同一时候accept一个socket,erlang 内部将使用队列保存acceptor信息。以先来先服务的原则将新的连接关联到acceptor,再给acceptor投递消息 {inet_async, L, Ref, Result}。

详细看\erts\emulator\drivers\common\inet_drv.c 的 tcp_inet_ctl 函数,erlang对socket的处理都集中在inet_drv.c

erlang配合{backlog, N},监听新连接效果更佳

backlog是erlang用来设置socket等待连接队列。N为队列的长度,默认值5,显然太小了

參考:

http://blog.csdn.net/mycwq/article/details/27108911

erlang怎样有效监听大量并发连接的更多相关文章

  1. 为什么有监听socket和连接socket,为什么产生两个socket

    为什么有监听socket和连接socket,为什么产生两个socket 先看一半的socket建立连接的双方的过程: 客户端: socket()---->创建出 active_socket_fd ...

  2. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

    本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...

  3. erlang如何有效地监视大量的并发连接

    阅读erlang一些开源web框架RabbitMQ.Ranch,他们使用多个进程在同一时间accept一socket.以这样的方式,使socketport监控共享很多其他的机会调度工作,但,在erla ...

  4. plsql启动提示监听服务无法连接

    话说现在用的oracle少了,本人菜鸟一个,但是我真心的没有感觉到它用的少了,今天入了一个新项目,数据库使用的还是oracle,经理二话不说的给了一些东西,说了让一句你把环境啥地 配置一下,然后走人了 ...

  5. [转]netstat -tnl 列出监听中的连接,查看端口是否开启

    任何网络服务的后台进程都会打开一个端口,用于监听接入的请求. 这些正在监听的套接字也和连接的套接字一样,也能被 netstat 列出来. 参数 tnl, 现在我们可以看到处于监听状态的 TCP 端口和 ...

  6. shell基础知识---与监听服务器长连接端口状态

    从未写过脚本我的最近接了俩脚本的需求,就在这分享一下我的我学到基础知识主要就四部分内容 一.变量 变量的定义 string='字符串' string="字符串" num=808st ...

  7. Android 实时监测(监听)网络连接状态变化

    http://blog.csdn.net/mxiaoyem/article/details/50708052

  8. 连接linux数据库Oracle时报错ORA-12541: TNS: 无监听程序

    远程服务器的数据库服务未开启,以及监听未打开 连接oracle 启动服务,startup 切换到oracle /bin 目录,cd $ORACLE_HOME/bin 启动监听, lsnrctl sta ...

  9. ORA-12541:TNS:无监听程序 配置Oracle Myeclipse无法连接上 花费一天时间解决掉的

    背景:自己机子做oracle服务器,其他机子可以ping得通我的机子,但是jdbc就是连不上,后来用plsql连出现无监听程序.... 我昨天重新安装Oracle后,用PL/SQL Developer ...

随机推荐

  1. 深度探索va_start、va_arg、va_end

    采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有大家熟悉的函数printf().s ...

  2. 不带头结点的单链表递归删除元素为X的结点

    #include <iostream> using namespace std; struct Node { Node *next; int elem; }; void creatList ...

  3. 连接池dbcp pool

    -package cn.gdpe.pool; import java.io.InputStream;import java.sql.Connection;import java.sql.Prepare ...

  4. 关于Linux 交互(用户操作接口)

    Linux 系统提供两种基本接口给用户操作:命令行,图形界面. 不同接口也有相应的访问终端. 一.命令行 Command Line Linux系统命令行,一般指 Shell. Shell 接受经键盘输 ...

  5. C# 窗体靠近屏幕边缘自动隐藏*学习(类似于QQ)

    using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; us ...

  6. IS打包

    1. 目的 让用户可以通过运行一个安装程序,安装程序到系统中正常运行. 2. 注意 当我们用项目向导生成的新项目时,InstallShield只为我们生成两个事件,分别是OnFirstUIBefore ...

  7. jQuery运维开发之第十七天

    JQuery 学习参考网址http://jquery.cuishifeng.cn/ python中叫模块,在DOM/BOM/Javascript中叫类库 现在的JQ版本有:1.x 2.x 3.x 建议 ...

  8. IOS--UILabel的使用方法详细

    IOS-UILabel的使用方法详细   //UILabel的使用 UILabel *oneLabel = [[UILabel alloc] init]; // 最经常使用的 oneLabel.fra ...

  9. MiniProfiler.3.0.10 用于MVC4.0中不能显示SQL语句

    MiniProfiler.3.0.10 用于MVC4.0中可以显示执行时间,但是不能显示SQL语句,怎么解决?

  10. COJ 0970 WZJ的数据结构(负三十)树分治

    WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计 ...