【发布时间】:2020-11-02 02:52:27
【问题描述】:
有一个由三个模块组成的程序。 Print 模块从键盘接收一个数字,将它传递给另一个模块,接收响应,并将其显示在屏幕上。 Proc1 和 Proc2 模块接收一个数字,执行计算,并将结果发回。
defmodule Launch do
@moduledoc """
Documentation for `Launch`.
"""
@doc """
"""
def start() do
children = [
%{
id: Print,
start: {Print, :print, []}
},
%{
id: Proc1,
start: {Proc1, :proc1, []}
},
%{
id: Proc2,
start: {Proc2, :proc2, []}
}
]
Supervisor.start_link(children, strategy: :one_for_one)
end
end
defmodule Print do
def print() do
num =
IO.gets("Input number: ")
|> String.trim()
|> String.to_integer()
if num >= 0 do
send(Proc1, {self(), num})
else
send(Proc2, {self(), num})
end
receive do
num -> IO.puts(num)
after
500 ->
print()
end
print()
end
end
defmodule Proc1 do
def proc1() do
receive do
{pid, num} ->
send(pid, 100/num)
proc1()
_e ->
IO.puts("Error")
end
end
end
defmodule Proc2 do
def proc2() do
receive do
{pid, num} ->
send(pid, 1000/num)
proc2()
_e ->
IO.puts("Error")
end
end
end
我正在尝试在单个主管的监督下运行所有进程。但是有一个问题——只有第一个“孩子”启动了,其他的“孩子”没有启动。在上面的示例中,Print 进程将启动,但 Proc1 和 Proc2 不会启动。如何在一个主管下运行所有进程?重要提示:Print进程必须获取Proc1和Proc2进程的地址才能通信。
【问题讨论】: