【问题标题】:Learning Erlang? speedbump thread, common, small problems学习二郎? speedbump 线程,常见,小问题
【发布时间】:2010-09-30 15:38:30
【问题描述】:

我只想知道当你刚接触 Erlang 时,你和最终解决方案之间遇到的所有小问题。

例如,这是我遇到的第一个减速带:

  1. 如果您在多个线程中生成,请使用 control_process(Socket, Pid)。正确的数据包到正确的线程。
  2. 您要开始与另一台服务器通话吗?记住 net_adm:ping('car@bsd-server')。在外壳中。否则将无法进行任何沟通。
  3. Timer:sleep(10),如果你不想做任何事情。调试时总是有用的。

【问题讨论】:

  • 好问题乔,但您应该将您的回答作为答案,或者将它们保留在您的问题中,而不是两者兼而有之。最好是答案。

标签: erlang


【解决方案1】:
  • 调试很困难。我只知道在我的代码中调用“error_logger:info_msg”。
  • 文档参差不齐 - 它们是正确的,但非常简洁。
  • 这是我自己的错,但是:我在了解 eunit 之前就开始编码,所以我的很多代码比应有的更难测试。

【讨论】:

    【解决方案2】:
    • 学习浏览标准文档

      一旦您了解了 OTP 文档的组织方式,就可以更轻松地找到您要查找的内容(您往往需要了解哪些应用程序提供了哪些模块或模块类型)。

      此外,仅仅浏览应用程序的文档通常是非常有益的 - 我通过这种方式发现了许多非常有用的代码 - sysdbgtoolbar 等。

    • shell erlang和module erlang的区别

      Shell erlang 是与模块 erlang 略有不同的方言。你不能定义模块函数(只有乐趣),你需要加载记录定义才能使用记录(rr/1)等等。学习如何根据匿名函数编写 erlang 代码有些棘手,但对于在具有远程 shell 的生产系统上工作至关重要。

      了解 shell 和 {start,spawn}_link ed 进程之间的交互 ​​- 当您运行一些崩溃的 shell 代码(引发异常)时,shell 进程将退出并将退出信号广播到您链接的任何对象。这将反过来关闭您正在处理的新 gen_server。 (“为什么我的服务器进程总是消失?”

    • erlang表达式和guard表达式的区别

      保护表达式(when 子句)不是 Erlang 表达式。它们可能看起来很相似,但它们完全不同。守卫不能调用任意 erlang 函数,只能调用守卫函数(length/1、类型测试、element/2 以及 OTP 文档中指定的其他一些函数)。守卫成功或失败并且没有副作用。另一方面,Erlang 表达式可以为所欲为。

    • 代码加载

      弄清楚代码升级的时间和方式,让 gen_server 升级到最新版本的回调模块 (code:load(Mod), sys:suspend(Pid), sys:change_code(Pid, Mod, undefined, undefined), sys:resume(Pid).)。

      代码服务器路径 (code:get_path/0) - 我数不清有多少次遇到未定义的函数错误,结果是我忘记在代码搜索路径中添加 ebin 目录。

    • 构建erlang代码

      想出一个有用的 emake(make:all/0erl -make)和 gnu make 的组合花了很长时间(到目前为止大约三年:)。

      我目前最喜欢的makefile可以在http://github.com/archaelus/esmtp/tree/master看到

    • Erlang 分布

      为了能够net_adm:ping/1 另一个节点,获取节点名称、dns、cookie 和所有其他内容。这需要练习。

    • 远程 shell IO 复杂性

      记住将group_leader() 传递给io:format 调用在远程节点上运行,以便输出出现在您的shell 中而不是神秘消失(我认为SASL 报告浏览器rb 仍然存在发送问题当通过远程 shell 连接使用时,它的一些输出到错误的节点)

    【讨论】:

      【解决方案3】:

      将它集成到 msvc 6 中,这样我就可以使用编辑器,并在输出窗口中查看结果。

      我创建了一个工具,用

      命令 - erlc 路径

      参数 - +debug_info $(FileName)$(FileExt)

      初始目录 - $(fileDir)

      选中使用输出窗口

      【讨论】:

        【解决方案4】:

        让我花最多时间思考的事情就是完全围绕函数调用和消息传递来构建我的代码的想法。其余部分要么只是从那里掉下来(生成、远程节点),要么感觉就像你必须用任何新语言(语法、stdlib)学习的常见内容。

        【讨论】:

          【解决方案5】:

          timer:sleep()

          暂停 X 毫秒。

          【讨论】:

            【解决方案6】:

            net_adm:ping()

            您要开始与另一台服务器通话吗?记住 net_adm:ping('car@bsd-server')。在外壳中。否则无法沟通。

            【讨论】:

              【解决方案7】:

              controlling_process()

              如果您在多个线程中生成,请使用 control_process(Socket, Pid)。正确的数据包到正确的线程。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-07-27
                • 2013-09-30
                • 1970-01-01
                • 2019-04-19
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多