【问题标题】:What are some usages for make_ref() function in elixir?elixir 中 make_ref() 函数有哪些用途?
【发布时间】:2018-08-12 05:53:33
【问题描述】:

我看到一个使用make_ref()的代码sn-p,不确定这个函数的可用性。

hexdocs 说:

返回一个几乎唯一的引用。

返回的引用将在大约 2^82 次调用后重新出现; 因此它对于实际用途来说是独一无二的。

由编译器内联。

但它并没有真正说明我应该何时或为什么使用它。我为什么要使用它,我应该什么时候使用它?在我看来,它所做的只是生成随机数。为什么我不能只使用某种随机数生成器?

这是它在终端上的作用:

iex(1)> make_ref()
#Reference<0.3569050097.3772514305.191818>
iex(2)> make_ref()
#Reference<0.3569050097.3772514305.191837>
iex(3)> make_ref()
#Reference<0.3569050097.3772514307.194286>

【问题讨论】:

    标签: elixir


    【解决方案1】:

    :erlang.make_ref/0 返回一个连接节点中唯一的引用

    这主要是 UUID 时代之前的遗产。也就是说,仅随机生成器是不够的:它应该生成一些在不同机器上独一无二的东西

    UUID 可能是引用的不错选择,除非您担心内存负载:引用是 way more efficient

    此外,调用make_ref [可以说] 比处理 UUID 生成器更方便。

    【讨论】:

      【解决方案2】:

      我看到它在发送消息时用作“唯一性”标志。

      this example from db_connection:

      def run_child(mod, fun, state, opts) do
        ref = make_ref()
        arg = [mod, fun, ref, self(), state, opts]
        {:ok, pid} = Task.Supervisor.start_child(__MODULE__, __MODULE__, :init, arg)
        mon = Process.monitor(pid)
        send(pid, {:go, ref, mon})
        {pid, mon}
      end
      
      def init(mod, fun, ref, conn, state, opts) do
        # ...
        receive do
          {:go, ^ref, mon} ->
            # ...
        end
      end
      

      这里make_ref/0 用于发送消息,该消息只能由知道引用的进程接收。这是一种将进程通信限制在特定“范围”内的相对简单的方法。

      除了那个 mudasobwa 的回答肯定是正确的。

      【讨论】:

        猜你喜欢
        • 2011-04-16
        • 2014-07-29
        • 2010-11-16
        • 1970-01-01
        • 2010-09-17
        相关资源
        最近更新 更多