`
cwqcwk1
  • 浏览: 86856 次
文章分类
社区版块
存档分类
最新评论
文章列表
ETS是Erlang内置的内存数据库,可用于多进程共享数据,具有并发读写的性能,文章就这点展开探讨,重点说说ets并发读写两个参数的优缺点及适用场合。 比如新建一个person的ets表: ets:new(person, [set, public, named_table, {write_concurrency, true}, {read_concurrency, true}]). 说说ets并发读写的两个参数:write_concurrency /read_concurrency write_concurrency(并发写) 可以提高多进程并发写ets的效率。通常来说,ets写数据时整 ...
最近在erlang shell做一些测试,为了让测试结果数据显得更直观,想对齐需要打印的数据,做成像表格一样的效果。 开始的想法是在数据中插入tab。当然,erlang也有对tab的支持,但实际效果不理想。 对tab的支持如下: 1> io:format("No1~sNo2~n1~s2~n", ["\t", "\t"]). No1 No2 1 2 ok 但数据的长度超过8个字符就有问题,那有没有一种可以自定对齐字符个数的写法? 有的,io:format/2对~s的支持还有~ns,n可以 ...
Erlang 有好几种运算符,比较运算符、数学运算符、布尔运算符,文章针对这几种运算符做讨论,参考erlang文档,以例子说明。 Erlang的比较运算符 写法如下: Expr1 op Expr2 1> 1 == 1. true op
mnesia创建的时候需要指定表record结构,如果定义的record结构修改了,就要更新数据的表结构,否则mnesia无法正常读取和写入数据。 我们最开始是这样定义结构的 -record(person, {name, age}). 然后这样建表 mnesia:create_table(person, [{disc_only_copies, nodes()}, {attributes, record_info(fields,person)}]). 有一天我们改变了这个person结构 -record(person, {name, age, money}). 我们还可以读出mn ...
erlang有两种复合结构,tuple和list,两者的区别是tuple子元素的个数是固定不变的,声明后就不能改变了;而list是可变的,可以通过[H|T]来取出或插入新元素。record有点像C/C++里面的结构体,实际上是语法糖,方便我们的开发,代码汇编时转成tuple表达形式。 Tuple tuple的表示方法如: {Term1,...,TermN}下面以例子说明erlang tuple及一些基本操作:1> A = {1,2}. {1,2} 2> tuple_size(A). 2 3> is_tuple(A). true 4> tuple_to_list(A). ...
erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内,如果超过了64 bytes,就被保存到进程外的共享堆里,可以给节点内所有进程共享。 erlang有两种二进制容器:heap binaries和refc binaries。 heap binaries Heap binaries are small binaries, up to 64 bytes, that are stored directly on the process heap. They will be copied when the process is garbage coll ...
mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了。这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies 、disc_copies都可能会发生。 如何重现这 ...
看了erlang的一些开源网络框架RabbitMQ、Ranch,他们都使用多个进程同时accept一个socket。这种方式在使得socket端口监听的工作分担了更多的调度机会,但是,在erlang中,socket接受一个新连接后,如果想让另一个进程处理消息,就要显式的调用gen_tcp:controlling_process(Socket, Pid)。 所以问题来了,erlang多个进程同时监听一个socket安全吗? 这种方式在早期的erlang是不安全的,但R11B03 版本之后,erlang做了改进,允许多个进程同时监听同一个socket。 erlangR11B03更新日志 OT ...
原文:Erlang进程堆垃圾回收机制 作者:http://blog.csdn.net/mycwq 每个Erlang进程创建之后都会有自己的PCB,栈,私有堆。erlang不知道他创建的进程会用到哪种场合下,所以一开始分配的内存比较小。如果分配的空间不够了,erlang gc会动态调整堆大小以满足需求,如果分配的空间大了,就会收缩堆,回收内存。 erlang进程堆的gc是分代gc,分代gc的想法基于统计学:大部分数据的生存周期都比较短,最新的数据更容易不再被使用。这里erlang使用young heap 和old heap来区分数据,young heap放新数据,old heap放旧数据,也 ...
在Linux下部署erlang项目,开发过程很多都是在Windows完成的,然后再发布到Linux,所以测试过程要在虚拟机下完成。有一天因为想要在虚拟机中使用到erlang图形化工具,比如appmon、tv、observer等等,便突发奇想得利用Windows的erlang连接到虚拟机中使用这些工具,来查看虚拟机的运行状态。 需要准备哪些东西? 我是在VmWare10虚拟Centos6.5系统,所以这里以VmWare10和Centos6.5为例,其他Linux系统及工具只做参考。 注意了,Linux的erlang要和Windows的erlang的主版本号要保持一致,比如你在Linux下选用 ...
erlang R17带来了新的socket选项{active,N} ,与{active,once}一起为应用层提供流量控制。为什么要多了这个选项,{active,once}不是可以有效抑制大量socket消息吗? 我们知道,{active,once}在每次接收到包都要重新设置active选项,才能继续接收erlang的消息通知。实际上,每次设定{active,once}都意味着调用一次epoll_ctl, 如果请求过于频繁,就会有大量的epoll_ctl调用。erlang目前只有一个线程会收割epoll_wait事件,epoll_wait要轮询已经就绪的ctl队列,如果大量的ctl事件将会阻塞 ...
总结eclipse常用快捷键,记熟的话,在一定程序上也可以提高开发效率。文章中,一些基本的功能如Ctrl + C,Ctrl + V,Ctrl + A就不一一列举了,在这里主要收集eclipse快速删除,函数跳转,内容注释,内容补全,文件名搜索,大小写转换等快捷键 [F3] 或者 [Ctrl] + 鼠标左键 : 跳转到声明,可用于函数跳转[Ctrl] + / 或者 [Ctrl] + [Shift] + C : 给选定的内容添加注释或取消注释。[Alt] + / : 内容提示,补全[Alt] + ← 和 [Alt] + → : 回退和前进历史浏览位置,在函数跳转时非常有用。[Alt] + ↓ 和 ...
用过Flash socket的同学都知道,Flash socket通讯有安全沙箱问题。就是在Flash Player发起socket通信时,会向服务端获取安全策略,如果得不到服务端响应,flash将无法连接到服务端。 首先,什么是Flash安全沙箱? Flash安全沙箱是Flash Socket的一种安全策略,为避免任意Flash终端与目标主机建立Socket通讯,以授权端口,域名方式限定连接。 那么,Flash Player怎么获取Socket策略? Flash Player发起socket通信请求的时候会先连接服务器端的843端口,获取Socket策略。当服务器没有开启843端口的时 ...
这几天在centos下装mysql,这里记录一下安装的过程,方便以后查阅 Mysql5.5.37安装需要cmake,5.6版本开始都需要cmake来编译,5.5以后的版本应该也要装这个。 安装cmake [root@local ~]# wget http://www.cmake.org/files/v2.8/cmake-2.8.12.2.tar.gz [root@local ~]# tar xvf cmake-2.8.12.2.tar.gz [root@local ~]# cd cmake-2.8.12.2 [root@local cmake-2.8.12.2]#./bootstrap [ ...
在网络通讯中,消息粘包是个很常见的问题。文章将讲解Erlang与As通讯时如何解决消息粘包问题。 解决方法是在消息内容前加消息长度,所以发送的数据为 len + body。 erlang端很好解决,只需修改socket {packet, N}属性,当N为1、2、4时,erlang会自动给消息加上包头。 AS端的做法在发送消息前先转成bytes,再计算内容长度;接收数据时先获取包头,再获取后面的数据。 AS端发送数据:var bytes:ByteArray = new ByteArray; bytes.writeUTFBytes(data); socket.writeShort(b ...
Global site tag (gtag.js) - Google Analytics