ユーザー入力に反応する簡単なエリクシルプログラムを作成しようとしています。私の問題は、stdioからの読み込みはタスクからはうまくいかないということです。私の考えがばかげているなら、それがどうやって成し遂げられたかの例を私に見せてください。私はウェブエリクサーでのユーザー入力の取得作業
で何かを見つけることができない私は、簡単な例まで私の問題を破った:
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.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
urヘルプと私の恐ろしい綴りを訂正してくれてありがとう:) – Kasuyakema