【问题标题】:How to correctly use concurrency in Erlang?如何在 Erlang 中正确使用并发?
【发布时间】:2018-10-02 10:27:55
【问题描述】:

我知道spawn 函数,但我不确定我是否正确使用它。我需要做的是通过数据库读取并让所有元素创建一个进程来与所有其他元素进行通信。

例如,假设我们有元素abcde

然后

  • a 必须具有与bcde 通信的进程。

  • b 必须与acde 通信。

  • c必须与abde等通信......

我所做的是循环遍历这些元素并将它们发送到我的 spawn 函数,但我不明白这是如何“并发”编程。

我应该/我可以为我的数据库中的每个单独元素设置一个spawn 函数吗?

【问题讨论】:

    标签: concurrency erlang


    【解决方案1】:

    有点难以理解这个问题和你的任务。 只要您有两个或多个进程同时运行,您就可以进行并发编程。

    您从数据库中获取 N 个元素,并为每个元素启动一个进程 X。您是否希望这些进程中的每一个都为 N 中的每个其他元素拥有子进程,因此每个 X 都有 N-1 个子进程?您可以让每个进程 X 生成 N-1 个进程作为子进程。由于您有 N 个 X 进程,每个进程并行运行,因此它是并发的。每个子进程都可以同时产生它们的子进程,并且每个子进程可以同时与其他子进程通信。在您的情况下,您有 N * (N-1) 个进程同时运行。 Erlang 调度程序将处理实际进程任务何时执行,因此如果您只有一个处理器,它们只会出现并发运行,因为调度程序将在运行进程之间切换非常快,如果您有 2 个内核而不是 2 个内核并发运行...但好在你不需要考虑这个问题,因为你是并发编写程序的,如果你在有多个处理器的硬件上运行它,Erlang 会使用它们。

    【讨论】:

      【解决方案2】:

      并发编程可能发生在进程a 向进程c 发送消息的同时,进程b 向进程e 发送消息。如果你的电脑有两个核心,那么进程a和进程b可以同时执行——从而同时发送消息。

      理解并发编程的最简单方法是当您需要请求一堆网页时。您首先创建一个请求一个网页的函数。然后你多次调用该函数。

      download("http:/www.xyz.com")
      download("http:/www.abc.com")
      ...
      ...
      download("http:/www.ghf.com")
      

      嗯,与计算机处理速度相比,等待来自网络服务器的响应需要很长时间,因此您的代码在等待服务器将第一个请求的响应发送回,然后发送第二个请求时什么也不做,并且您的程序必须再次坐在那里等待来自网络服务器等的响应,等等。

      使用并发编程,您可以快速发送所有请求,然后您的代码基本上只等待一次响应,然后您的代码就会忙于做其他事情。但请注意,要使并发编程更快,当您的程序串行执行时必须有等待。

      在您的问题描述中,您提到某些实体需要相互通信。如何?通过使用! 发送erlang 消息?如果是这样,那么您的问题描述要求 a、b、c、d、e 都是单独的进程。因为 erlang 消息传递本质上就像执行一些简单的算术运算,所以同时传递消息不会比一个接一个地发送消息效率高多少。

      【讨论】:

        猜你喜欢
        • 2015-07-12
        • 1970-01-01
        • 2013-11-13
        • 1970-01-01
        • 1970-01-01
        • 2013-10-05
        • 2017-01-10
        • 2021-05-22
        • 1970-01-01
        相关资源
        最近更新 更多