【问题标题】:Same Machine Erlang communication同机 Erlang 通信
【发布时间】:2010-12-24 02:12:22
【问题描述】:

我需要回答以下问题,以帮助了解我应该采用什么方法与 Erlang 交互。 SMP UNIX 机器上的 AFAIK Erlang 使用多进程方法。在这种情况下,它应该做相同的机器 IPC。

  1. Erlang 是否为 UNIX 使用 UNIX 域套接字?
  2. Windows 是否使用命名管道?

  3. 如果它没有实现上述两种结构——即,没有用于 windows 的命名管道;它必须回退到 Windows 上的套接字。

  4. 上述原则是如何实现的,它们是使用面向消息、每个通道单线程、异步构造还是其他方式?

  5. 如果我上面的推理不正确,它是否使用主子树和所有其他进程通过主节点间接通信?

-- 编辑 1--

Link 到 erlang 二进制格式文档。

普遍的共识是 Unix 域套接字的性能优于 TCP/IP。我想我会尝试扩展 Erlang 以使用提供的更好的原语。我还强烈怀疑 TCP/IP 事件循环中没有使用 epol 和 windows IOPC —— 我会在审核完代码后回复。

另一个SO post 声称 Erlang 确实不支持 TCP 和 UDP 以外的任何东西。

有两个用于通信的Erlang库Erlang node -> c_nodec_node -> Erlang_node

Erlang module for sockets 允许在 UNIX 下打开 Unix Dom 套接字。

【问题讨论】:

标签: asynchronous erlang multithreading ipc portability


【解决方案1】:

作为对您最初的问题和一些 cmets 的评论:

  • 非常确定,事实上我知道,在节点内部,Erlang VM 不使用套接字或管道在 (Erlang) 之间进行通信过程。这将是荒谬的,并且完全违背了轻量级(Erlang)进程间通信的基本 Erlang 原则。

  • 在 Erlang 节点之间,Erlang VM 使用 TCP/IP。从 Erlang 看到的语义和行为与节点内通信相同,在大多数方面它是完全透明的,所涉及的进程位于哪些节点上。

  • SMP 不会改变这些基础,无论使用多少内核和调度程序,也不管每个内核运行多少调度程序。

【讨论】:

【解决方案2】:

R1。它使用 TCP/IP(事实上,对于 UNIX 域套接字没有任何“标准”支持)

R2。我很确定它仍然是 TCP/IP 套接字

R3。见 R2

R4。有一种适合 Erlang 的二进制交换格式,它是基于消息的。交换可以是同步的(类似 RPC)或异步的。

R5。没有主人。


作为奖励(帮助您节省时间):不要忘记使用注册名称(-sname 或 -name)以使用节点间通信(RPC 或其他)。

【讨论】:

  • 也许我误读了这个问题,但很难相信 Erlang 调度程序通过 TCP/IP 进行通信。
  • @zed,是的,难以置信。在我对开源内容的回顾中,我看到了许多次优的 IPC 实现。 BSD TCP/IP 和 select() 几乎是很多人编程的标准。如果您找到任何源文件或有关调度程序的参考手册,我将不胜感激。
  • 伙计们-也许我已经用有色眼镜阅读了这个问题:我假设 IPC 节点之间(在 Erlang 意义上),因为如果我们谈论的是 intra -node IPC,那么我当然很确定它不是基于 TCP/IP 的。
  • 每个节点都有自己的调度器。我也不知道为什么我们在这里讨论调度程序。
  • [解释][1] Erlang使用的SMP模型,它采用单进程多线程模型。因此,从调度程序的角度来看,本地 IPC 不是问题。 [1]:erlang.org/euc/08/euc_smp.pdf
猜你喜欢
  • 2014-11-09
  • 1970-01-01
  • 2012-05-01
  • 2016-09-25
  • 2013-10-01
  • 1970-01-01
  • 2011-04-19
  • 2012-11-21
  • 2020-06-01
相关资源
最近更新 更多