如何在Erlang中正确使用并发?

时间:2018-04-22 06:08:33

标签: concurrency erlang

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

例如,假设我们有元素abcde

然后

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

  • b必须与acde进行沟通。

  • c必须与abde进行通信,依此类推....

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

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

2 个答案:

答案 0 :(得分:1)

当进程a在处理c向进程b发送消息的同时向进程e发送消息时,会发生并发编程 }}。如果您的计算机有两个核心,则进程a和进程b可以同时执行 - 从而同时发送消息。

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

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

那么,与计算机处理速度相比,等待来自Web服务器的响应需要很长时间,因此您的代码在等待服务器为第一个请求发送响应时无效,然后发送第二个请求,您的程序必须再次坐在那里等待来自Web服务器等的响应等。

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

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

答案 1 :(得分:0)

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

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