- 浏览: 337679 次
- 性别:
- 来自: 北京
最新评论
-
perfect_control:
真的很详细,一些东西很容易被我忽略掉了
使用fprof进行性能分析 -
leeyisoft:
http://www.erlangqa.com/ 怎么变成 “ ...
Erlang问答网站,欢迎各位提出问题,解答问题。 -
simsunny22:
4年之后我才看到 慢慢的干货
Erlang服务器内存耗尽bug跟踪过程 -
爱死我:
...
使用etop查看系统中进程信息 -
宋兵甲:
在跑这个服务的时候,每秒建立一个客户端连接,连续建立10000 ...
自己写一个tcp 通用服务器
文章列表
因为ecrawler,需要具有DNS解析功能,看文章都介绍说,要注意系统提供的gethostbyname之类的函数内部实现机制,是采用顺序执行,还是启动多个连接并发执行?
我在erlang中做了一下测试(windows2003 + R12B-3):
1,首先清空本地的dns信息(cmd中 ipconfig /flushdns)
2,多个process同时调用inet:getaddr/2请求dns地址
3,wireshark抓包,发现同时只有4个DNS(port 53)的请求,4个dns请求成功后,第一个又进行了一次请求,结果我的只有5个请求解析成功,其他的都是{error, timeout} ...
- 2009-01-13 11:14
- 浏览 2453
- 评论(0)
查看原文:http://www.wagerlabs.com/blog/2008/08/erlang-recursive-anonymous-functions-and-waiting-for-messages.html
我们有个需求,我们要等待某个消息,同时过滤指定的消息。我们可以定义一个macro,来实现。
看代码:
-define(WAITMSG(Msg, Timeout, Skip),
fun() ->
F = fun(F) ->
receive
Msg ->
success;
Packet -> ...
- 2009-01-13 11:10
- 浏览 1730
- 评论(0)
继续上一部分,我们已经可以开发一个简单的ejabberd module了,这次让我们开发一个简单的http处理模块。这个http模块可以输出服务器中登录的用户列表(json格式)。
首先,再我们上节的my_module中添加一个process/2导出函数:
-module(mod_http_hello_world).
-author('your@mail.com').
-vsn('1.0').
-define(EJABBERD_DEBUG, true).
-behavior(gen_mod).
-export([
start/2,
stop/1,
...
- 2009-01-13 11:08
- 浏览 7812
- 评论(1)
参考:
http://anders.conbere.org/journal/
http://www.process-one.net/en/wiki/ejabberd_module_development/
ejabberd的内部的很多模块都是以插件的形式工作,这样我们也可以开发自己的模块融合到ejabberd中去,完成各种各样我们独特的需求。
ejabberd定义 ...
- 2009-01-13 11:04
- 浏览 10417
- 评论(6)
为了写一个好的产品,必定离不开完善的测试。
最近开始筹划项目,因此单元测试必不可少,一定要在开始的时候把测试做好,从下到上才能让产品更加坚固。
我们选择使用EUnit进行单元测试。使用Eunit的好处:减少代码的修改;提高开发速度;有利于接口与实现分离;有利于系统集成;还有测试本身可以作为一种文档。
1,首次从http://support.process-one.net/doc/display/CONTRIBS/EUnit 获取对应的SVN checkout路径,http://svn.process-one.net/contribs/trunk/eunit,通过svn进行下载。
2,将整 ...
- 2009-01-13 11:02
- 浏览 2210
- 评论(1)
看bob的mochiweb,然后阅读json的代码,因为R12B对binary做了优化,而mochijson2.erl是采用的记录binary中偏移量的方法来进行匹配,因此决定写一个执行binary优化的json解析模块。
周六在家没事写了写tqjson.erl,最后发现效率提升4%左右,应该还算比错。
附件是代码,可能写的不是高效,敬请原谅,其中用到miwebnum模块进行float转化。
对于性能:
tqjson > mochijson2 > mochijson
- 2009-01-13 11:00
- 浏览 2531
- 评论(0)
erlang中变量只能一次赋值,这么“苛刻“的要求下,更别想拥有全局变量了。
变量只在function中存在,这就是函数编程语言的特色。
对于函数参数对应的变量从执行函数开始,到函数执行结束(从咱们编程者的角度来看的确如此,至于从运行时,GC的角度看,咱们就不深究了)。
比如下面的函数:
test1(V) ->
io:format("V is:~p~n", [V]),
% .... other routine
V.
test执行,V进行pattern match,绑定数值,随后进入函数体,执行各种操作。最后test返回,V也就结束了其使命。
如果变 ...
- 2009-01-13 10:58
- 浏览 6758
- 评论(0)
我们想写这样一个tcp server,其绑定本地某个端口,用户可以接入实现特定的业务,比如一个傻傻的echo server,一个帮助服务器等等。。毫无疑问这个tcp的框架是相同的,想想我们一直以来怎么写tcp server:
创建socket -> 绑定端口 -> listen监听 -> accept tcp 连接 -> 处理业务 -> 关闭连接。中间可能会有多线程或者线程池等等不同的实现方式。
在erlang的世界,我们还是需要绑定端口,接受连接,处理业务,关闭连接,但是我们没有什么线程,锁的烦恼。我们为每个连接建立一个process,处理业务。因为erlang ...
- 2009-01-13 10:51
- 浏览 10508
- 评论(4)
R12B中引入了bit string(bits),其包含任意数目的bit,如果其包含的bit数目可以被8整除,那么我们称其为binary(bytes)。
使用bits
有了bits,我们对某些协议的操作更加简便灵活。
比如IS 683-PRL 协议,其首部包含5个bit指示后面有多少个连 ...
- 2009-01-13 10:37
- 浏览 2080
- 评论(0)
在mailist中,一位朋友表示疑问,为什么下面的语句提示出错?erlang的运行时数据绑定有什么特殊规则?
>{ok, File} = file:open("test.file", [write, raw, {delayed_write, math:pow(10, 3), 1000)]).
** exception error: no match of right hand side value {error,badarg}
提示badarg,参数错误。
其实不是运行时绑定有什么问题,而是math:pow/2返回的数据类型为float, 而file:ope ...
- 2009-01-13 10:31
- 浏览 3239
- 评论(1)
Socklabs在其项目中需要限制用户上传的图片类型为gif,png和jpeg, 同时图片文件大小必须 < 4M, 图片尺寸小于2048*2048.这个模块很简单,以binary的方式读取文件,随后通过图片相应的格式解析,获取格式,尺寸相关信息.随后可以做出判断.
...
- 2009-01-13 10:30
- 浏览 2262
- 评论(0)
erlang中错误大体分为四种:
1. 编译错误
2. 逻辑错误
3. 运行时错误
4. 用户代码生成的错误
编译错误,主要是编译器检测出的代码语法错误
逻辑错误,是指程序没有完成预期的工作,属于开发人员的问题
运行时错误,是指erlang运行时抛出的错误,比如对非数据类型执行算术运算,erlang运行时会捕获异常,并抛出。在erlang中,这类异常的类型为error
用户自定义错误,是指通过exit/1或者throw/1生成
我们把运行时错误以及用户抛出的错误称为异常(exception),他们具有三种类型:throw, error, exit。
error型异常 ...
- 2009-01-13 10:26
- 浏览 11384
- 评论(0)
在erlang中,每个process都有一个独立的heap(初始大小233个words),process用到的数据都保存在其自身的heap 中。这个heap可以动态的进行扩张与收缩。当heap中的数据达到heap大小的75%的时候,heap的大小会自动增大(依据fibonacci数进行增长,而不是类似某些语言实现中依据倍数增长),当heap中的数据小于heap大小的25%的时候,heap会自动进行缩小(上面涉及到的数据25%,75%可能不是很准确,这无关紧要)。
在erlang中拥有成千上万的process,其garbage collection是针对每个process来实现,每个proces ...
- 2009-01-13 10:21
- 浏览 2210
- 评论(0)
昨天写测试代码的时候,遇到了一些疑惑,那就是erlang中control process.
在使用gen_tcp进行开发的时候,我们可以通过调用gen_tcp:accept和gen_tcp:connect而产生socket,此时调用所在的process,称为这个socket的control process. control process的生存期控制 ...
- 2009-01-13 10:19
- 浏览 3807
- 评论(0)
浏览Mochiweb的源代码的时候,发现了一个比较陌生的module声明。
在erlang的maillist中找到了答案!网上有两篇文章对其进行了描述,这里简单概述一下,具体可以参看原文:
http://www.clickcaster.com/items/the-black-art-of-erlangs-parameterized-modules
http://www.lshift.net/blog/2008/05/18/late-binding-with-erlang
在模块的attribute声明中,我们可以采用这样的形式:
-module(fruit, [Param1, Param ...