Multithreading 在多线程中启动多进程elixir
我只是对db as中的服务器列表执行一些操作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
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个(特别是如果列表很大的话)?好吧,你说的听起来不错,但我不知道,也没有