Elixir IEx外壳,如何突破当前的“接收”障碍
我是长生不老药的新手,在Elixir IEx外壳,如何突破当前的“接收”障碍,elixir,elixir-iex,Elixir,Elixir Iex,我是长生不老药的新手,在iexshell中进行实验学习,我是一个没有问题的人 为简单起见,我们将当前shell会话进程称为“主进程” 我生成一个子进程,在“主进程”中编写一个receive块来侦听子消息。当点击回车键时,它会将“主进程”置于等待状态。这基本上冻结了“主要流程”,使其对进一步输入不负责任 很多次我都被错误地困在这种状态中。如果我搞砸了,我需要关闭shell并重新开始,失去所有的状态和设置 我的问题:是否有办法撤销/取消/中断工作的接收块 或者,是否有一种方法,我可以启动另一个会话,
iex
shell中进行实验学习,我是一个没有问题的人
为简单起见,我们将当前shell会话进程称为“主进程”
我生成一个子进程,在“主进程”中编写一个receive
块来侦听子消息。当点击回车键时,它会将“主进程”置于等待状态。这基本上冻结了“主要流程”,使其对进一步输入不负责任
很多次我都被错误地困在这种状态中。如果我搞砸了,我需要关闭shell并重新开始,失去所有的状态和设置
我的问题:是否有办法撤销/取消/中断工作的接收
块
或者,是否有一种方法,我可以启动另一个会话,而不终止前一个会话,然后向它发送一些消息来解冻它?我认为您不能中断
接收
,您可以使用另一个进程的PID终止该进程,或者为其设置超时,然后,如果在此超时窗口之间未收到任何消息,您将恢复会话的控制权
receive do
a -> a
after
1_000 -> "nothing after 1s"
end
看看采取第二种方法需要一些工作。每个iex
实例都是一个单独的OTP节点,因此为了使这两个节点相互通信,您需要执行以下操作:
为每个cookie指定相同的cookie和不同的名称:
将全局名称与接收器节点关联(在node1
中运行):
将节点1连接到节点2(在node1
中运行):
现在,您可以使用receive
在node1
中开始侦听消息。要将消息从node2发送到node1,请在集群中查找其PID并将消息分派到那里:
:global.whereis_name(:node1) |> send "Hello!"
“使用进程的PID终止进程”你的意思是终止“主进程”?这正是我想要避免的。但是,是的,在解决我的问题之后加入,好主意。只需要记得每次都这么做。仍然希望看到其他答案,如果没有,我会接受这个。我喜欢这个方法!我知道我可以将.iex.exs
文件放在cwd中,但它无法处理CLI选项。有没有办法在配置文件中保存选项?
:global.register_name(:node1, self())
Node.connect(:"node2@127.0.0.1")
:global.whereis_name(:node1) |> send "Hello!"