Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在多线程中启动多进程elixir_Multithreading_Elixir - Fatal编程技术网

Multithreading 在多线程中启动多进程elixir

Multithreading 在多线程中启动多进程elixir,multithreading,elixir,Multithreading,Elixir,我只是对db as中的服务器列表执行一些操作 list_servers() |> Enum.map(fn(server) -> go_through_and_email(server) end) 我唯一的问题是,是否有可能分别为每台服务器启动每个通过电子邮件(服务器)过程?现在,它完成了第一个,然后进入第二个。我们可以并行运行它们吗?由于list\u服务器可以有100个或100多个对象 我不想使用Task.wait或Task.async,还有其他选项可供探索吗?您可以使用Tas

我只是对db as中的服务器列表执行一些操作

list_servers()
|> Enum.map(fn(server) ->
  go_through_and_email(server)
end)
我唯一的问题是,是否有可能分别为每台服务器启动每个
通过电子邮件(服务器)
过程?现在,它完成了第一个,然后进入第二个。我们可以并行运行它们吗?由于
list\u服务器可以有100个或100多个对象


我不想使用
Task.wait
Task.async
,还有其他选项可供探索吗?

您可以使用
Task.async\u stream/3
。它允许您传递一个可枚举项并在其上运行一个函数,并使用
max\u concurrency
选项限制并行运行的最大任务数。默认的
超时时间是5000ms,您可能需要指定一个更大的超时时间

下面是一个小例子:

1..20
|> Task.async_stream(fn x ->
  :timer.sleep(1000)
  x
end, max_concurrency: 4, timeout: 10_000)
|> Enum.each(&IO.inspect/1)

如果运行此操作,您将看到每秒4批打印的
{:ok,1}
{:ok,20}
。整个过程应该在5秒钟内完成,正如在对20个项目分4批运行1秒睡眠时所预期的那样。

您可以使用
Task.async\u stream/3
。它允许您传递一个可枚举项并在其上运行一个函数,并使用
max\u concurrency
选项限制并行运行的最大任务数。默认的
超时时间是5000ms,您可能需要指定一个更大的超时时间

下面是一个小例子:

1..20
|> Task.async_stream(fn x ->
  :timer.sleep(1000)
  x
end, max_concurrency: 4, timeout: 10_000)
|> Enum.each(&IO.inspect/1)

如果运行此操作,您将看到每秒4批打印的
{:ok,1}
{:ok,20}
。整个过程应该在5秒钟内完成,正如在对20个项目分4批运行1秒睡眠时所预期的那样。

您可以做的一件事是使用
任务。启动
,但您不想使用任务模块

另一件事是去掉
Enum.map
中的
通过电子邮件(服务器)
。假设
server
是DB server,您应该创建一个将与DB服务器通信的genserver,并在
map
中向每个genserver发送消息

Enum.map(list_of_gen_servers, &send_message_to_go_through_email(&1))
然后每个GenServer都会并行处理代码。当然,您需要准备genserver列表。这绝对比显式使用
send/receive
要好

编辑


如果您想
发射并忘记
,任务模块将非常有用。如果您经常访问DB服务器,并且允许完全控制通信模型的外观,则GenServer将是更好的选择。

您可以做的一件事是使用
任务。启动
,但您不想使用任务模块

另一件事是去掉
Enum.map
中的
通过电子邮件(服务器)
。假设
server
是DB server,您应该创建一个将与DB服务器通信的genserver,并在
map
中向每个genserver发送消息

Enum.map(list_of_gen_servers, &send_message_to_go_through_email(&1))
然后每个GenServer都会并行处理代码。当然,您需要准备genserver列表。这绝对比显式使用
send/receive
要好

编辑


如果您想
发射并忘记
,任务模块将非常有用。如果您经常访问DB服务器,并且它们允许完全控制通信模型的外观,那么GenServer将是更好的选择。

您也可以使用GenServer。如果list_servers()和go_through_和_email()将被定义为助手函数,则您应该能够执行以下操作:

defmodule ExampleGenServer do
  use GenServer

  ## Client API
  def start_link(name) do
    GenServer.start_link(__MODULE__, [], name: name)
  end

  def go_through(name) do
    GenServer.cast(name, {:go_through, name})
  end

  ## Server API / Callbacks
  def init(initial_state) do
    {:ok, initial_state}
  end

  def handle_cast({:go_through, name}, state) do
    state = go_through_and_email(server)
    {:noreply, state}
  end

  def handle_info({:some_info}, state) do
    # stuff
    {:noreply, state}
  end

  ## Helper functions
  defp list_servers() do
    # stuff
  end

  defp go_through_and_email() do
    # stuff
  end
end
然后可以在循环中创建GenServer的新实例:

list_servers()
|> Enum.map(fn(server) ->
  ExampleGenserver.start_link(server)
end)
我在休息时很快就做到了,这样我可能会错过/搞糟一些事情;) 如果您需要有关GenServer的更多详细信息,请参阅我的。它描述了GenServer客户端/服务器API、消息传递和参数传递;)
还有一件事,请记住GenServer拆卸

您也可以使用GenServer。如果list_servers()和go_through_和_email()将被定义为助手函数,则您应该能够执行以下操作:

defmodule ExampleGenServer do
  use GenServer

  ## Client API
  def start_link(name) do
    GenServer.start_link(__MODULE__, [], name: name)
  end

  def go_through(name) do
    GenServer.cast(name, {:go_through, name})
  end

  ## Server API / Callbacks
  def init(initial_state) do
    {:ok, initial_state}
  end

  def handle_cast({:go_through, name}, state) do
    state = go_through_and_email(server)
    {:noreply, state}
  end

  def handle_info({:some_info}, state) do
    # stuff
    {:noreply, state}
  end

  ## Helper functions
  defp list_servers() do
    # stuff
  end

  defp go_through_and_email() do
    # stuff
  end
end
然后可以在循环中创建GenServer的新实例:

list_servers()
|> Enum.map(fn(server) ->
  ExampleGenserver.start_link(server)
end)
我在休息时很快就做到了,这样我可能会错过/搞糟一些事情;) 如果您需要有关GenServer的更多详细信息,请参阅我的。它描述了GenServer客户端/服务器API、消息传递和参数传递;)
还有一件事,请记住GenServer拆卸

您还可以将真正的任务推迟到另一位主管。我无法决定在您的案例中是否需要一个简单的功能或gen服务器,但请看一下
simple\u one\u for\u one

这种类型的主管非常适合这种需求(发送电子邮件,如果我没有弄错的话)


另外,你说没有任务,但是玩任务。异步流和超时也是另一个合适的选择。

你也可以将真正的任务推迟到另一个主管。我无法决定在您的案例中是否需要一个简单的功能或gen服务器,但请看一下
simple\u one\u for\u one

这种主管是一个非常适合这种需要的人(如果我正确的收到电子邮件)


另外,你说不要
任务
,但是玩
任务。异步流
和超时也是另一个合适的选择。

你为什么不想使用那些
任务
函数呢?我过去有过一个非常糟糕的经历,每次我把东西放到任务中,它们只会超时。失败..您可能只需要为任务指定一个更大的超时时间。等待
。默认值为5秒。一个简单的Task.async+await将同时生成所有任务。你可能想批量生产,例如,我猜是10个(特别是如果列表很大的话)?好吧,你说的听起来不错,但我不知道,也没有