Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir IEx外壳,如何突破当前的“接收”障碍_Elixir_Elixir Iex - Fatal编程技术网

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!"