`
litaocheng
  • 浏览: 337679 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
因为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} ...
查看原文: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 -> ...
继续上一部分,我们已经可以开发一个简单的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, ...
参考: http://anders.conbere.org/journal/ http://www.process-one.net/en/wiki/ejabberd_module_development/ ejabberd的内部的很多模块都是以插件的形式工作,这样我们也可以开发自己的模块融合到ejabberd中去,完成各种各样我们独特的需求。 ejabberd定义 ...
为了写一个好的产品,必定离不开完善的测试。 最近开始筹划项目,因此单元测试必不可少,一定要在开始的时候把测试做好,从下到上才能让产品更加坚固。 我们选择使用EUnit进行单元测试。使用Eunit的好处:减少代码的修改;提高开发速度;有利于接口与实现分离;有利于系统集成;还有测试本身可以作为一种文档。 1,首次从http://support.process-one.net/doc/display/CONTRIBS/EUnit 获取对应的SVN checkout路径,http://svn.process-one.net/contribs/trunk/eunit,通过svn进行下载。 2,将整 ...
看bob的mochiweb,然后阅读json的代码,因为R12B对binary做了优化,而mochijson2.erl是采用的记录binary中偏移量的方法来进行匹配,因此决定写一个执行binary优化的json解析模块。 周六在家没事写了写tqjson.erl,最后发现效率提升4%左右,应该还算比错。 附件是代码,可能写的不是高效,敬请原谅,其中用到miwebnum模块进行float转化。 对于性能: tqjson > mochijson2 > mochijson
erlang中变量只能一次赋值,这么“苛刻“的要求下,更别想拥有全局变量了。 变量只在function中存在,这就是函数编程语言的特色。 对于函数参数对应的变量从执行函数开始,到函数执行结束(从咱们编程者的角度来看的确如此,至于从运行时,GC的角度看,咱们就不深究了)。 比如下面的函数: test1(V) -> io:format("V is:~p~n", [V]), % .... other routine V. test执行,V进行pattern match,绑定数值,随后进入函数体,执行各种操作。最后test返回,V也就结束了其使命。 如果变 ...
我们想写这样一个tcp server,其绑定本地某个端口,用户可以接入实现特定的业务,比如一个傻傻的echo server,一个帮助服务器等等。。毫无疑问这个tcp的框架是相同的,想想我们一直以来怎么写tcp server: 创建socket -> 绑定端口 -> listen监听 -> accept tcp 连接 -> 处理业务 -> 关闭连接。中间可能会有多线程或者线程池等等不同的实现方式。 在erlang的世界,我们还是需要绑定端口,接受连接,处理业务,关闭连接,但是我们没有什么线程,锁的烦恼。我们为每个连接建立一个process,处理业务。因为erlang ...
R12B中引入了bit string(bits),其包含任意数目的bit,如果其包含的bit数目可以被8整除,那么我们称其为binary(bytes)。 使用bits 有了bits,我们对某些协议的操作更加简便灵活。 比如IS 683-PRL 协议,其首部包含5个bit指示后面有多少个连 ...
在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 ...
Socklabs在其项目中需要限制用户上传的图片类型为gif,png和jpeg, 同时图片文件大小必须 < 4M, 图片尺寸小于2048*2048.这个模块很简单,以binary的方式读取文件,随后通过图片相应的格式解析,获取格式,尺寸相关信息.随后可以做出判断. ...
erlang中错误大体分为四种:    1. 编译错误    2. 逻辑错误    3. 运行时错误    4. 用户代码生成的错误 编译错误,主要是编译器检测出的代码语法错误 逻辑错误,是指程序没有完成预期的工作,属于开发人员的问题 运行时错误,是指erlang运行时抛出的错误,比如对非数据类型执行算术运算,erlang运行时会捕获异常,并抛出。在erlang中,这类异常的类型为error 用户自定义错误,是指通过exit/1或者throw/1生成 我们把运行时错误以及用户抛出的错误称为异常(exception),他们具有三种类型:throw, error, exit。 error型异常 ...
在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 ...
昨天写测试代码的时候,遇到了一些疑惑,那就是erlang中control process. 在使用gen_tcp进行开发的时候,我们可以通过调用gen_tcp:accept和gen_tcp:connect而产生socket,此时调用所在的process,称为这个socket的control process. control process的生存期控制 ...
浏览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 ...
Global site tag (gtag.js) - Google Analytics