- 浏览: 52851 次
- 性别:
- 来自: 广州
-
最新评论
文章列表
1 同步
A发送消息给B,要等B返回结果,A才继续执行,否则一直处于等待状态(或直到超时)
举例说明:在erlang中,
{ok, Value} = gen_server:call(TargetPid, Request)
Fun(Value, Args), %%要等gen_server:call返回才能继续向下执行
Fun2,
...
2 异步
A发送消息给B,不需要等待B的返回结果,继续执行下去
gen_server:cast(TargetPid, Msg)
Fun, %%继续向下执行
Fun2,
...
1、并发
在单核系统中,为了提高cpu利用率,系统采用时间片轮询等调度方式,对多个线程轮换执行,在宏观上看,线程是同时执行的,从微观上看,某一时刻只执行一个线程:这就是并发。
在发生资源竞争或者大量的上下文切换会导致性能消耗
2、并行
在多核时代,线程可以真正的做到同一时刻多个运行:每个线程可以在不同的核上运行
借用别人的一个图来简单说明并发和并行
一、erlang socket的消息流的三种控制方式:
1 主动模式 {active, true}
2 被动模式 {active, false}
3 混合模式 {active, once}
1 主动消息获取(非阻塞)
在该模式下,无法控制发到服务端的消息流,如果客户端生产消息的速度大于服务端消费消息的速度,会导致服务端消息缓冲区溢出
{ok, ListenSocket} = gen_tcp:listen(Port, [...,{active,true}...],
{ok, Socket} = gen_tcp:accept(ListenSocket}
loop_recei ...
-module(tcp_parallel_server).
-compile(export_all).
-define(TCP_OPT, [binary, {packet, 4}, {reuseaddr, true}, {active, true}]).
start_server() ->
{ok, ListenSocket} = gen_tcp:listen(8888, ?TCP_OPT),
spawn(fun() -> parallel_connect(ListenSocket) end).
parallel_connect(Lis ...
简单web sever改进版:串行服务器,一次只接受一个连接
代码:tcp_sequence_server.erl
-module(tcp_sequence_server).
-compile(export_all).
-define(TCP_OPT, [binary, {packet, 4}, {reuseaddr, true}, {active, true}]).
start_server() ->
{ok, ListenSocket} = gen_tcp:listen(8888, ?TCP_OPT),
seq_loop(ListenSo ...
gen_tcp:connect(Host,Port,[Options]),gen_tcp:send(Socket, Request)。用这个两个函数从服务器获取数据
代码如下:tcp_client.erl
-module(tcp_client).
-export([get_url/0]).
get_url() ->
get_url("www.baidu.com").
get_url(Host) ->
{ok, Socket} = gen_tcp:connect(Host, 80, [binary, {packet, ...
现在来写个简单的web服务器,要实现的功能是:只接受一个socket连接请求。
服务器代码:tcp_server.erl
-module(tcp_server).
-compile(export_all).
-define(TCP_OPT, [binary, {packet, 4}, {reuseaddr,true}, {active, true}]).
%% binary 设置通信数据格式,可以通过简单的term_to_binary编码, binary_to_term解码
%% {packet, 4} 每个报文从一个4字节长的头开始
%% {reuseaddr, ...
SASL (System Architecture Support Libraries) 提供错误日志,过载保护等应用
本文主要说sasl错误日志
配置:elog.config
[{sasl,
[{sasl_error_logger, false},
{errlog_type, error},
{error_logger_mf_dir, "/data/my_sasl/log"},
{error_logger_mf_maxbytes, 10485760},
{error_logger_maxfiles, 1 ...
erl启动参数分类
1 emulator flags 用“+”连接,用于控制模拟器行为的
2 flags 用“-”开头,erlang运行时系统参数,可用init:get_argument/1获得
3 plain flags -extra 后面的都是普通参数
常用的Flags
-detached
以daemon方式在后台运行,不启动shell
-eval Expr
表达式作为启动参数
erl -eval "Mod:Fun(Args)"
-pa Dir1 Dir2
-pz Dir Dir2
-remsh Node
远程连接目标节点Node
...
SMP:Symmetrical Multi Processor 对称多处理器
原理
1:disable SMP
一个调度器对应一个运行队列
没有SMP支持的erlang VM 只有一个Scheduler运行于主线程,Scheduler从运行队列中取出需要运行的erlang进程和IO任务
2:enable SMP =
多个调度器对应一个运行队列:这时会比上面慢,因为锁保护
有SMP支持的erlang VM 可以有1-1024个Scheduler,每个Scheduler运行于一个独立的操作系统线程,操作系统决定它是否要在不同的核上面运行。由于多个Scheduler从同一个公共运行队列中去除需 ...
平时需要用到比较少,但是一到关键时刻却又需要,老是忘记 。写个备忘
元字符
常用元字符表:
字符 说明
.
匹配除换行符以外的任意字符
\w
匹配字母、数字、汉字、下划线
\s
匹配任意空白符
\d
匹配数字
\b
匹配单词的开头或结尾
^
匹配字符串的开头
$
匹配字符串的结尾
字符转义
如果要查找元字符本身,必须使用\来消除元字符的特殊意义。eg:c:\\windows 匹配 c:\windows
反义
字符 说明
\W
匹配字母、数字、汉字、下划线以外的任意字符
\S
匹配任意不是空白的字符
\D
匹配任意不是数字的字符
\B
匹配不是单词开头或结尾的 ...
erlang_protobuffs源码下载地址:
https://github.com/basho/erlang_protobuffs
因为这个项目是用rebar编译的,本人比较笨 ,不会玩rebar,所以就提取了src文件夹里面的代码,自己写了个makefile来编译
下面就来记录一下我的实验步骤
1 创建项目目录结构
cd /data
mkdir -p protobuffs/{ebin,hrl,proto,scripts,src/{include,mod}}
2 导入源文件到src/mod目录下
3 这里有个注意事项:里面有protobuffs_parser.yrl和p ...
erlang安装
1 解压包
tar -zxvf otp_src_R16B03.tar.gz
2 安装前配置
cd otp_src_R16B03/
./configure --prefix=/usr/local/erlang --without-javac
3 make && make install
4 做个软连接
ln -s /usr/local/erlang/bin/erl /usr/bin/erl
5 最后结果
erl
安装过程中发现问题:
1 configure: error: No curses library functions found
解决 ...
首先,拿到tools包:步骤如下
在vmware虚拟机开启情况下,点击设置-安装vmware-tools
在centos中,root用户登录,mount /dev/cdrom /media/cdrom
cp VMwareTools-8.4.4-301548.tar.gz /tmp/
1 解压
cd /tmp
rz
tar -xvf VMwareTools-8.4.4-301548.tar.gz
2 执行安装
./vmware-install.pl
直接默认enter就行了
3 安装过程中可能遇到的问题
1 GCC尚未安装
引用Searching for GC ...
subversion是一个非常好用的版本管理工具。
1 安装
yum install -y subversion subversion-devel
2 创建版本库(单库)如果想创建多个版本库执行多次svnadmin create /data/svn/仓库名称
mkdir /data/svn/exam_test
svnadmin create /data/svn/exam_test/
如下图
2 初始化版本库
cd /data
mkdir -p exam_test/{trunk/{server,client},tags,branches}
svn import exam_test ...