Elixir 关于Task.Supervisor.async\u stream\u nolink的示例?
试着用很少的测试来申请,但不起作用 以下是我的实现:Elixir 关于Task.Supervisor.async\u stream\u nolink的示例?,elixir,Elixir,试着用很少的测试来申请,但不起作用 以下是我的实现: defmodule MySupervisor do use Supervisor def start_link do Supervisor.start_link(__MODULE__, []) end def init([]) do children= [ worker(Basic, []) ] supervise(c
defmodule MySupervisor do
use Supervisor
def start_link do
Supervisor.start_link(__MODULE__, [])
end
def init([]) do
children= [
worker(Basic, [])
]
supervise(children, strategy: :one_for_one)
end
end
defmodule Basic do
use GenServer
def start_link do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
end
strings = ["long string", "longer string", "there are many of these"]
stream = Task.Supervisor.async_stream_nolink(MySupervisor, strings, fn text -> text |> String.codepoints |> Enum.count end)
Enum.reduce(stream, 0, fn {:ok, num}, acc -> num + acc end) |> IO.puts
但是,我有一个错误:
**(从#PID退出)在以下位置退出:GenServer.call(MySupervisor,{:start#u child,[#PID,:monitor,
{:nonode@nohost,#PID},{:erlang,:apply,
[#函数,[“长st环”]]},
:无穷大)
**(退出)无进程:进程不活动或当前没有与给定名称关联的进程,可能是因为其
应用程序未启动
16:24:34.317[错误]发电机服务器#PID终止
**(停止)退出:GenServer.call(MySupervisor,{:start_child,[#PID,:monitor,{:nonode@nohost,#PID},{:erlang,
:apply,[#函数,[“长字符串”]}]},
:不完整性)
**(退出)无进程:进程不活动或当前没有与给定名称关联的进程,可能是因为其
应用程序未启动最后一条消息:{:退出,#PID,
{:noproc,{GenServer,:call,{:MySupervisor,{:start\u child,
[#PID,:监视器,{:nonode@nohost,#PID},{:erlang,
:apply,[#Function任务.Supervisor中的功能只能在通过任务.Supervisor.start链接/1启动的监控程序上运行 您可以启动一个未命名的实例,并将pid传递给
async\u stream\u nolink/4
:
{:ok, supervisor} = Task.Supervisor.start_link
stream = Task.Supervisor.async_stream_nolink(supervisor, strings, fn text -> text |> String.codepoints |> Enum.count end)
或启动命名实例并传递其名称:
Task.Supervisor.start_link name: MySupervisor
stream = Task.Supervisor.async_stream_nolink(MySupervisor, strings, fn text -> text |> String.codepoints |> Enum.count end)
两种情况下的输出均为47
如果希望此主管与应用程序一起运行,可以将其添加到应用程序的现有顶级主管下,如下所示:
children = [
supervisor(Task.Supervisor, [name: MySupervisor]),
...
]
然后呢
Task.Supervisor.async_stream_nolink(MySupervisor, ...)
Task.Supervisor
中的功能只能在使用Task.Supervisor.start\u link/1
启动的监控程序上运行
您可以启动一个未命名的实例,并将pid传递给async\u stream\u nolink/4
:
{:ok, supervisor} = Task.Supervisor.start_link
stream = Task.Supervisor.async_stream_nolink(supervisor, strings, fn text -> text |> String.codepoints |> Enum.count end)
或启动命名实例并传递其名称:
Task.Supervisor.start_link name: MySupervisor
stream = Task.Supervisor.async_stream_nolink(MySupervisor, strings, fn text -> text |> String.codepoints |> Enum.count end)
两种情况下的输出均为47
如果希望此主管与应用程序一起运行,可以将其添加到应用程序的现有顶级主管下,如下所示:
children = [
supervisor(Task.Supervisor, [name: MySupervisor]),
...
]
然后呢
Task.Supervisor.async_stream_nolink(MySupervisor, ...)
哎呀!我编辑了你的答案而不是我的问题!我想你可能误读了我的答案——即使你通过了pid,你也需要通过任务主管的pid(
Task.Supervisor.start\u link
,而不是MySupervisor.start\u link
)。那么,我该如何定制它呢?例如,策略或失败的流程图。。有一些选项任务。主管。开始链接/1
接受这里记录的内容:。嗨,Dogbert,你能在elixir论坛上检查这个问题吗:ops!我编辑了你的答案,而不是我的问题!我想你可能误读了我的答案swer——即使传递pid,也需要传递任务主管的pid(Task.Supervisor.start\u link
,而不是MySupervisor.start\u link
).那么,我该如何定制它呢?例如,策略或失败的流程图..这里有一些选项Task.Supervisor.start\u link/1
接受这里记录的内容:。嗨,Dogbert,你能在elixir论坛上查看这个问题吗: