博文

目前显示的是 三月, 2013的博文

Windows上的Erlang命令行快速启动

Erlang程序设计中文版中提到过,如果你把erlang的代码放在一个别的地方,那么你每次启动可能都需要运行 cd("c:/your_code_path")。 每次都需要运行一次,这无疑是很麻烦的一个事情。 于是作者也提出一个好办法,那就是在建立一个名为.erlang文件放在erlang的安装目录: 文件内容如下: io:format("consulting .erlang in ~p~n",           [element(2, file:get_cwd())]). c:cd("E:/WorkSpace/erlang"). io:format("Now in:~p~n", [element(2, file:get_cwd())]). 原书上说的是直接放在erlagn的安装目录就可以了,但是可能是erlang一直伴随着升级而书不可能跟着升级得那么快的缘故,现在把这么个文件放在形如:“D:\Dev\erl5.10.1”这样的安装目录下已经不起作用了。 真正的解决方法是放在安装目录下的/usr/文件夹下,形如:“D:\Dev\erl5.10.1\usr” 至于Windows下无法让你创建形如.erlang这样的文件的问题,直接找个Editplus之类的第三方编辑器然后用另存为的方式就可以了。

在CentOS上安装和启动Erlang

首先保证自己的系统中起码有GCC和GCC-C++吧 yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel 然后到这里去下载最新的源码包吧: http://www.erlang.org/download.html 解包编译安装: wget http://www.erlang.org/download/otp_src_R16B.tar.gz tar -xvf otp_src_R16B.tar.gz cd otp_src_R16B ./configure --prefix=/usr/local/erlang --enable-hipe --enable-threads --enable-smp-support --enable-kernel-poll make && make install 拷贝可执行文件到 /user/bin/ cd /usr/bin/ ln -s /usr/local/erlang/lib/erlang/bin/erl erl ln -s /usr/local/erlang/lib/erlang/bin/erlc erlc 这就完结了.. 启动的时候使用 erl +K true 这样就会打开核心的epoll模式了,否则会大幅度降低性能 没有打开epoll模式时: Erlang R16B (erts-5.10.1) [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] Eshell V5.10.1  (abort with ^G) 打开epoll之后: Erlang R16B (erts-5.10.1) [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:true] Eshell V5.10.1  (abort with ^G) 简单的方法是直接修改~/.bashrc 添加一行: alias erl='...

Ternado,同步与异步

图片
总所周知,Ternado是一个非阻塞的Web服务器,很多人因为它的高效性,因为它的短小精悍而选择使用它。同样的理由,我们也选择了使用它。但是在用了它快一年后的今天,我才发现我根本就没有使用到它真正的异步特性。 首先,什么是阻塞?什么是非阻塞?以下两张图就应该能够解释一切了: 阻塞(同步)模型 非阻塞(异步)模型 两个模型从图形上理解起来都很容易。一个是顺序执行,另外一个则是打乱顺序执行。 理论上讲,非阻塞的模型并不一定绝对拥有最佳的效率,但是它在外部调用频繁、涉及到多处IO请求的状况下,它理论上拥有更高的执行效率,因为它在同步处于等待状态下的时间段内它也依然在尽力的压榨着CPU的运算能力。而异步模型最大的问题就是频繁的在多个进程(线程)中调度过程中的CPU消耗。 那么按照Ternado中给出的示例代码的执行结果是什么? 你会惊讶的发现,它官网给出的所有代码执行出来的结果都是同步的。也就是说你根本无法真正的启用它的异步特性。 import time import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") class BlockHandler(tornado.web.RequestHandler): def get(self): time.sleep(10) self.write("Final Over") application = tornado.web.Application([ (r"/", MainHandler), (r"/test/", BlockHandler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start() 做一个简单的试验,运行这个程序,...

Python中为什么要用is None来代替== None?

一直以来,我对于Pycharm提示我让我用is None来替代 == None这个判断表达式表示不是很理解。 直到我看到了《Python3程序开发指南》中的一句话: “身份比较的一个好处是速度非常快, 这是因为,并不必须对进行比较的对象本身进行检查,is操作符只需要对对对象所在的内存地址进行比较——同样的地址存储的是同样的对象。” 因为None是一个特殊的内置的空对象,所以所有的为None的对象都是指向的同一个内存地址的。所以用is None的速度也应该超过== None。 简单的试验一下: __author__ = 'Siglud' import time def testIsNone(): now = time.time() a = None i = 0 while i < 100000: if a is None: i += 1 return time.time() - now def testEqualNone(): now = time.time() a = None i = 0 while i < 100000: if a == None: i += 1 return time.time() - now if __name__ == '__main__': totalTime_isNone = 0 totalTime_equalNone = 0 for i in range(10): useTime = testIsNone() print 'TYPE:UseIS TestNum: %s, Time consumed: %s' % (i, useTime) totalTime_isNone += testIsNone() for i in range(10): useTime = testEqualNone() print 'TYPE:UseEqual TestNum: %s, Tim...