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论坛上查看这个问题吗: