Elixir:Async HTTP的重点是什么?

时间:2014-05-30 15:16:54

标签: http asynchronous actor elixir

我习惯于在线程上运行请求处理程序的语言,因此所有I / O函数都有异步版本以防止阻塞线程。

在Elixir中,每个请求都在一个轻量级进程(actor?)中处理,运行时可以在一个OS线程上复用数千个actor。如果actor阻塞,则运行时交换另一个actor以使用cpu。因为,一个actor可以在不阻塞线程的情况下阻塞,但我没有看到Elixir中的异步函数。然而,我在HTTPotion文档中遇到了这个问题:

iex> HTTPotion.get "http://floatboth.com", [], [stream_to: self]
%HTTPotion.AsyncResponse{id: {1372,8757,656584}}

这里的异步功能有什么意义?

1 个答案:

答案 0 :(得分:3)

根据HTTPME的README,使用stream_to将导致消息被发送到http响应的每个块的提供的Pid。您可以使用接收块接受这些并相应地处理它们。

一般来说,说“在Elixir中,每个请求都被处理......”是没有意义的,因为请求意味着非常具体的事情。假设这与webapp和入站请求有关。

在Elixir中,每个进程都是按顺序执行的一大块代码。当那块代码完成后,进程就会死掉。 HTTPotion中的一个使用异步响应可能是选择性接收,您希望尽可能快地处理内容,但是匹配特定模式的消息可能优先。选择性接收是Erlang如何处理并发性的好处之一,例如Go处理它(CSP)。

希望这有帮助。关键是,一个actor可以阻止而不阻塞操作系统级别的线程,但有时你希望给定的消息具有优先权,在这种情况下,选择性接收邮箱具有重要价值。例如,假设其中一条可能的消息相当于“shucks,因为这个值,我知道我根本不关心这个http响应。”然后,您可以关闭该进程,而不是浪费CPU处理已在邮箱中排队的(早先收到的,CPU密集型)消息。