Я пытаюсь написать простую программу-эликсир, способную реагировать на ввод пользователя. Моя проблема в том, что чтение из stdio не работает из Tasks. Если вся моя идея глупа, пожалуйста, покажите мне пример того, как это делается. ничего не могу найти в сети
Я разбил свою проблему на простой пример:
t = Task.async((fn->IO.gets "what?" end))
%Task{owner: #PID<0.65.0>, pid: #PID<0.80.0>, ref: #Reference<0.0.2.135>}
Задача запущена:
iex(4)> pid=Map.get(t, :pid)
#PID<0.80.0>
iex(5)> Process.alive? pid
true
и жив, но не печатает на stdio и не читает. Он не завершается нормально или с исключением. Я тоже пробовал IO.read/2.
В моей программе Task запускается с помощью Task.spawn_link/1, но проблема та же самая.IO.gets/2, и код, следующий за функцией IO.gets/2, не выполняется.
Супервайзер, начинающий задание:
defmodule Prime do
use Application
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
# Define workers and child supervisors to be supervised
worker(Task, [fn->Prime.IO.communicate(nil) end], restart: :transient),
supervisor(Prime.Test.Supervisor, [])
]
opts = [strategy: :one_for_one, name: Prime.Supervisor]
Supervisor.start_link(children, opts) end end
Функции задач:
defmodule Prime.IO do
@doc """
handles communication with the user and user demanded Actions.
"""
def communicate(numTasks) do
case(numTasks) do
nil ->
{numTasks, _} =Integer.parse(IO.gets "This program searches for prime numbers per try and error.\nHow many concurrent Tasks?\n")
Prime.IO.communicate(numTasks)
x when is_number(x) ->
Prime.Test.Server.setTaskNumber(numTasks)
Prime.IO.communicate("waiting")
y when is_bitstring(y) ->
IO.puts(numTasks)
_ ->
Prime.IO.communicate(nil)
end
end
end