Erlang 和 Stackless Python 有一定相似之处,都使用轻量级线程和消息传递(Stackless Python 当然也可以使用共享变量)。
简单例子:
# 摘自:http://www.stackless.com/wiki/Channels
import stackless
def Sending(channel):
print "sending"
channel.send("foo")
def Receiving(channel):
print "receiving"
print channel.receive()
ch=stackless.channel()
task=stackless.tasklet(Sending)(ch)
task2=stackless.tasklet(Receiving)(ch)
stackless.run()
-module(message).
-export([start/0]).
sending(Pid) ->
io:format("sending~n"),
Pid ! foo.
receiving(Pid) ->
io:format("receiving~n"),
receive
X ->
io:format("~p~n", [X])
end,
Pid ! done.
start() ->
Pid = spawn(fun() -> receiving(self()) end),
sending(Pid),
receive
X -> X
end.
Erlang 的消息是通过进程邮箱(mailbox)来传递的,每进程绑定一个邮箱。
Stackless Python 消息通过 Channel 传递,Channel 是可以任意创建的,这有一个优点是你可以在同一个进程中使用数据 Channel 和控制 Channel,甚至根据功能来分割。
还有个更好的场景说明它的好处,在一个 server S 进程中向另一个 server X 发送请求,server S 的 mailbox 可能同时存有来自 client 和 server X 的消息,其它语言不一定能很方便地实现 Selective Receive,接收会比较麻烦,即便是 Erlang,这也是有成本的。
如果在向 server X 请求时创建一个新的 Channel 用来接收消息,就完全没有这个麻烦了,Erlang 中要实现这个功能应该也不是麻烦事,又造了一个轮子。
Erlang也可以在每个消息到来时,创建一个进程来处理,也可以避免这个问题,和创建 Channel 效果是一样的。
在使用 ucontext 实现的轻量级线程环境中,还是尽可能减少线程创建的开销,创建一个 Channel 很容易,实现多个 Channel 的 Poll 就更强大了。Channel 还可以使用泛型实现,约束传递的类型。
-----------------------------------------------------
补上我的Channel C++实现介绍,待整理。
template <class T>
class ChannelT : public Channel {
public:
// ...
void Send(const T& v);
T Receive(int timeout=-1);
};
使用:
typedef ChannelT<int> IntChannel;
typedef shared_ptr<IntChannel> IntChannelPtr;
void process1(IntChannelPtr channel) {
for(int i=0; i<10; i++) {
channel->Send(1);
Sleep(1000);
}
channel->Send(-1); // 退出消息
}
void process2(IntChannelPtr channel) {
while (true) {
int i = channel->Receive();
// ...
}
}
IntChannelPtr channel = new IntChannel;
SPAWN(&process1, channel);
SPAWN(&process2, channel);
这和 mailbox 相似,不过process1可以省去一个 mailbox。
使用Channel名字:
Cid cid;
// Channel名字注册
void foo_process() {
ChannelT<int> channel;
cid = channel.cid; // 给其它进程使用
RegisterChannel("foo", channel); // 注册Channel名字,也可以使用ID
int i = channel.Receive();
// ...
}
ChannelT<int> channel("foo"); // 通过名字发送给Node内Channel
channel.Send(1);
ChannelT<int> channel(cid); // 通过Channel ID发送
channel.Send(1);
Channel名字代替了进程名字,ChannelID代替了ProcessID,以前每创建一个进程就要生成一个PID,现在只有使用Channel才生成CID,Channel的创建和销毁开销比进程小。多个进程在同一个Channel上等待消息时,进程要挂在Channel的等待链上。
直接使用远程Channel:
ChannelT<int> channel("foo@172.16.1.5");
channel.Send(1);
Channel也可以传递到其它Node上,对方得到此Channel时直接调用它的Send就可以发送消息回来。
在通讯层面上,Channel是逻辑概念,它通过Node之间的连接来传递数据,和Erlang相似。
分享到:
相关推荐
Stackless Python 是Python编程语言的一个增强版本,它使程序员从基于线程的编程方式中获得好处,并避免传统线程所带来的性能与复杂度问题。Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,...
java php python erlang 千万级内存数据性能比较,
Stackless Python 是Python编程语言的一个增强版本,它使程序员从基于线程的编程方式中获得好处,并避免传统线程所带来的性能与复杂度问题。Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,...
NULL 博文链接:https://xiajs.iteye.com/blog/1871551
Python 的简单封装接口,封装了 ErlPort 调用,可方便的进行: Make module-level calls Get module-level constants Instantiate objects Call object methods Get object attributes Call builtins and ...
scala erlang groovy python 原理 比较 分析
派尔 PyErl是Python的Erlang接口。 这可以帮助您集成用Python和Erlang编写的程序。依赖该模块需要以下其他模块和库: Erlang / OTP R12或更高版本在Debian中: apt-get install erlang-dev安装python setup.py build...
一个用Python实现的Erlang结点,使用gevent库,努力同时与Python 2和Python 3兼容
erlang -c语言程序接口.pdferlang -c语言程序接erlang -c语言程序接口.pdf口.pdf
这是第一卷。 在2008 CN Erlounge III的“Erlang应用程序接口”讲演的视频。PPT等其它资料在这里: http://blog.csdn.net/aimingoo/archive/2009/01/14/3777765.aspx 有关信息参见: ...
我在Erlounge III大会上的讲演PPT。 相关的视频在这里: http://groups.google.com/group/erlang-china/browse_thread/thread/2154c39503795edc
rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang
EMQTT是采用Erlang语言开发,全面支持MQTT V3.1.1协议,支持集群和大规模连接的开源MQTT消息服务器。EMQTT致力于发布一个基于Erlang/OTP语言平台,企业级稳定可靠,完全开源免费,可集群支持大规模物联网、移动...
ErlangB和ErlangC计算工具(exe可执行文件+excel两个) ErlangB和ErlangC计算工具(exe可执行文件+excel两个)
rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。
最近开发 Erlang ,对其字符串处理能力无言至极,于是决定把它和python联合起来,打造一个强力的分布式系统,等将来需要系统级开发时,我再把 C++/C组合进来. 首先参考了 Erlang 官方文档和 ...
编写分布式的 Erlang 程序:陷阱和对策 硝烟中的Erlang 深入底层: erlang VM基于多核处理器的可伸缩性特征 erlang VM内部数据共享机制 erlang 消息传递机制 文章地址:...
erlang的timer和实现机制 Erlang程序设计
适合学习Erlang开发的同仁们研读,压缩包除服务核心之外,还包含了大量不同的网络消息协议插件,便于异构协议之间的消息交换,很有价值的东西,但是,研读具有一定难度,需要了解Erlang的OTP编程和一定的网络协议...