如何在GenServer中执行对当前进程的调用?

use*_*827 5 elixir erlang-otp

我知道我可以像这样叫GenServer

GenServer.call(pid, request)
# using a pid
Run Code Online (Sandbox Code Playgroud)

或者像这样

GenServer.call(registered_name, request)
# if I registered the process with a name
Run Code Online (Sandbox Code Playgroud)

但有没有办法GenServer.call在不知道pid /注册名称的情况下执行模块内部?(即有什么类似GenServer.call(__CURRENT_PROCESS__, request)?)

Paw*_*rok 5

这根本行不通.A GenServer.call只是向给定进程发送消息,然后等待另一条消息(回复),阻止当前进程.如果您以self这种方式发送消息,则该进程将无法自由处理该消息,因为它将被阻止等待回复.所以call总会超时.

我怀疑你需要的只是将你想要的功能提取到一个函数中并直接调用它.或者,您可以发送cast到当前进程,有效地告诉它"稍后"执行某些操作.


Ono*_*cci 4

我不确定这是最好的方法,但您正在寻找的是Kernel.self/0

编辑:

根据 Sasha 的评论,代码如下所示:

GenServer.call(self, request)
Run Code Online (Sandbox Code Playgroud)

编辑:

根据 Pawel Obrok 提出的精彩观点,您永远不应该调用当前进程。如果您需要向当前进程发送消息,您应该以这种方式进行:

GenServer.cast(self, request) 
Run Code Online (Sandbox Code Playgroud)

注意,这是铸造与通话。