`
qiezi
  • 浏览: 497167 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Erlang 消息接口和 Stackless Python 的 Channel 比较

阅读更多
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相似。
分享到:
评论
4 楼 mryufeng 2009-10-12  
多通道确实不错 但是实现上会复杂不少 不知道这个收益和付出是否相当。。。
3 楼 qiezi 2009-10-12  
上面说的成正比是极端情况下~
2 楼 qiezi 2009-10-12  
mryufeng 写道
还有个更好的场景说明它的好处,在一个 server S 进程中向另一个 server X 发送请求,server S 的 mailbox 可能同时存有来自 client 和 server X 的消息,其它语言不一定能很方便地实现 Selective Receive,接收会比较麻烦,即便是 Erlang,这也是有成本的。

这种场合{server, Msg} 和 {client, Msg} 选择性接收的成本是很低很低的

呵呵,这不是和 mailbox 里面的消息数成正比嘛~ 当然这里假设的场景,服务器的并发处理能力不可能高,或许例子不合适。
1 楼 mryufeng 2009-10-12  
还有个更好的场景说明它的好处,在一个 server S 进程中向另一个 server X 发送请求,server S 的 mailbox 可能同时存有来自 client 和 server X 的消息,其它语言不一定能很方便地实现 Selective Receive,接收会比较麻烦,即便是 Erlang,这也是有成本的。

这种场合{server, Msg} 和 {client, Msg} 选择性接收的成本是很低很低的

相关推荐

    python-2.6.5-stackless.msi

    Stackless Python 是Python编程语言的一个增强版本,它使程序员从基于线程的编程方式中获得好处,并避免传统线程所带来的性能与复杂度问题。Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,...

    Scala、Groovy++、Stackless Python、Erlang 学习笔记及分享

    它的核心特性包括轻量级进程(processes)、消息传递和故障隔离。Erlang以其容错性和高可用性著称,广泛应用于电信、分布式系统和实时计算领域。 压缩包中的"编程语言简谈.pptx"文件可能包含了对这些语言的深入探讨...

    java php python erlang 千万级内存数据性能比较

    本文将深入探讨Java、PHP、Python和Erlang这四种语言在处理千万级内存数据时的性能差异。 首先,让我们从Erlang开始。Erlang是一种并发性极强的函数式编程语言,特别适合构建分布式、容错系统。在提供的文件"erlang...

    python-3.1.2-stackless.msi

    Stackless Python 是Python编程语言的一个增强版本,它使程序员从基于线程的编程方式中获得好处,并避免传统线程所带来的性能与复杂度问题。Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,...

    Erlang生态的分布式Pythonpy.zip

    Python 的简单封装接口,封装了 ErlPort 调用,可方便的进行: Make module-level calls Get module-level constants Instantiate objects Call object methods Get object attributes Call builtins and ...

    Python-一个用Python实现的Erlang结点使用gevent库

    Erlang是一种用于构建高可用性、容错性和并发系统的编程语言,而gevent是Python中的一个库,它提供了基于协程的并发模型,通过greenlet(轻量级线程)实现非阻塞I/O,从而提高了Python在处理大量并发连接时的效率。...

    scala erlang groovy python 原理 比较 分析

    标题和描述均提到了对五种编程语言——Scala、Erlang、Groovy、Python以及它们各自的原理、比较和分析。这些语言各自拥有独特的特性和应用场景,在编程领域扮演着不同的角色。下面,我们将深入探讨每种语言的关键...

    python-erlang-interface:Python的Erlang接口

    派尔 PyErl是Python的Erlang接口。 这可以帮助您集成用Python和Erlang编写的程序。依赖该模块需要以下其他模块和库: Erlang / OTP R12或更高版本在Debian中: apt-get install erlang-dev安装python setup.py build...

    erlang -c语言程序接口.pdf

    ### Erlang与C语言程序接口详解 #### 一、引言 在软件开发领域,不同编程语言之间的交互是一项重要的技术。Erlang作为一种专为构建高并发、容错性强的应用程序而设计的语言,在与其他语言(如C语言)的集成方面具有...

    Python-Director灵活快速和强大的Erlang流程管理库

    Python-Director库是一个高效、灵活且强大的Erlang流程管理工具,主要面向那些希望利用Erlang的并发特性和分布式能力,但又习惯于Python编程的开发者。在Python开发过程中,有时我们需要处理复杂的并发和分布式任务...

    Erlang应用程序接口(视频,1/4)

    这是第一卷。 在2008 CN Erlounge III的“Erlang应用程序接口”讲演的视频。PPT等其它资料在这里: http://blog.csdn.net/aimingoo/archive/2009/01/14/3777765.aspx 有关信息参见: ...

    pickle:Erlang 库,用于在 Python 泡菜和 Erlang 术语之间进行转换

    pickle 是 Python 中用于序列化和反序列化对象的一个模块,而 Erlang 是一种并发、分布式、容错的编程语言,以其强大的消息传递机制著称。 描述中提到的“泡菜”实际上是指 Python 的 pickle 模块。Python pickle ...

    Erlang应用程序接口 - Topic at CN Erlounge III

    我在Erlounge III大会上的讲演PPT。 相关的视频在这里: http://groups.google.com/group/erlang-china/browse_thread/thread/2154c39503795edc

    Erlang和RabbitMQ安装包

    Erlang和RabbitMQ是两个在分布式系统和消息队列领域中至关重要的技术。Erlang是一种函数式编程语言,以其并发性、容错性和热代码升级能力而闻名,而RabbitMQ则是基于Erlang构建的一个开源消息代理,用于实现应用程序...

    Erlang官网下载过慢

    在IT行业中,Erlang因其强大的实时性和处理大量并发连接的能力而被广泛应用于电信、互联网基础设施和实时系统。RabbitMQ,一个基于Erlang开发的消息队列系统,是实现异步通信的关键组件。 标题中提到的“Erlang官网...

    Go/Python/Erlang编程语言对比分析及示例代码

    它支持丰富的数据类型,包括基础类型、复合类型、引用类型和接口类型。接口类型的引入,让Go语言在处理类型系统方面更加灵活。指针的使用,为Go语言在系统编程和性能敏感领域提供了强大的支持。 Python语言,以其...

    ERLANG和PYTHON互通实现过程详解

    这篇文章主要讲解了如何在Erlang和Python之间实现通信,这对于构建分布式系统或者利用不同语言的优势处理特定任务非常有用。Erlang以其并发特性和稳定性著称,而Python则因为其丰富的库和易读性而受到青睐。通过两者...

    RabbitMQ3.9.13和ErLang24.2版本

    RabbitMQ是一款开源的消息代理和队列服务器,它使用AMQP(Advanced Message Queuing Protocol)协议,广泛应用于分布式系统中的消息传递。RabbitMQ 3.9.13是该软件的一个稳定版本,提供了多项改进和修复,确保了高...

    erlang和rabbitmq.zip

    【标题】"erlang和rabbitmq.zip" 涉及到的是两个关键技术:Erlang编程语言和RabbitMQ消息队列系统。Erlang是一种并发性极强、容错性出色的函数式编程语言,而RabbitMQ是基于Erlang开发的开源消息代理和队列服务器。 ...

    Erlang和RabbitMQ 消息队列

    Erlang是一种为并发和分布式计算设计的编程语言,而RabbitMQ是一个基于AMQP(Advanced Message Queuing Protocol)的消息中间件,广泛应用于各种复杂场景。本文将深入探讨Erlang与RabbitMQ在消息队列中的应用及核心...

Global site tag (gtag.js) - Google Analytics