gpt4 book ai didi

erlang - Threaded Erlang C-Node(cnode) 互操作性如何?

转载 作者:行者123 更新时间:2023-12-01 15:37:25 25 4
gpt4 key购买 nike

我正处于 Erlang 开发阶段,需要创建一个 C-Node(有关 C-Node 文档,请参阅 link)。基本实现很简单,但是,文档中有一个巨大的漏洞。

该代码实现了单线程客户端和服务器。暂时忽略客户端......实现服务器的'c'代码是单线程的,一次只能连接到一个erlang客户端。

  • 启动 EPMD ('epmd -daemons')
  • 启动服务器应用程序 ('cserver 1234')
  • 启动 erlang 客户端应用程序 ('erl -sname e1 -setcookie secretcookie') [在与 #2 不同的窗口中]
  • 从 #3
  • 中的 erlang shell 执行服务器命令 ('complex3:foo(3).')

    现在服务器正在运行并且当前的 erlang shell 已连接到服务器,请从另一个窗口再次尝试。
  • 打开一个新窗口。
  • 启动一个 erlang 客户端('erl -sname e2 -setcookie secretcookie')。
  • 执行一个新的服务器命令 ('complex3:foo(3).')。

  • 请注意,系统似乎挂了...什么时候应该执行命令。它挂起的原因是因为另一个erlang节点已连接并且没有其他线程在监听连接。

    注意:连接处理中似乎存在错误。我在接收块中添加了一个超时,我发现了一些错误的行为,但我没有全部得到它们。此外,如果我在执行指定的步骤后强制第一个 erlang 节点终止,我能够让 cserver 崩溃而不会出现警告或错误。

    所以问题是……实现线程化 C 节点的最佳方法是什么?什么是合理的连接数?

    最佳答案

    cnode tutorial中的cnode实现示例并不是要处理多个连接的节点,因此您遇到的第一个症状是正常的。
    erl_accept call 是接受传入连接的。

    if ((fd = erl_accept(listen, &conn)) == ERL_ERROR)
    erl_err_quit("erl_accept");
    fprintf(stderr, "Connected to %s\n\r", conn.nodename);
    while (loop) {
    got = erl_receive_msg(fd, buf, BUFSIZE, &emsg);

    请注意,以这种方式编写,cnode 将只接受一个连接,然后将描述符传递给读/写循环。这就是为什么当 erlang 节点关闭时,cnode 以错误结束,因为 erl_receive_msg会失败,因为 fd将指向一个关闭的套接字。

    如果要接受多个入站连接,则必须循环接受连接并实现一种处理多个文件描述符的方法。您不需要多线程程序来执行此操作,使用 poll 可能更容易(也可能更有效)。或 select syscall 如果您的操作系统支持它们。

    至于最佳连接数,我认为没有规则,如果您想在 cnode 中支持高并发,则需要对您的应用程序进行基准测试。但在这种情况下,重新设计系统可能会更好,以便 erlang 处理并发,从而减轻 cnode 的负担。

    关于erlang - Threaded Erlang C-Node(cnode) 互操作性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2518776/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com