如何在雅司病中处理多个(A)的请求?

时间:2013-03-15 11:50:57

标签: erlang yaws erlangweb

最近,我已经开始研究erlang&中的REST api了。雅司病。 我不明白yaws&我的模块处理多个请求。

我确实有api模块收集所有请求:

appmods = </, api>

和我的测试模块:

-module(api).
out(_Arg) ->
    io:format("my pid  ~p ~n", [self()]),
    loop(200000000),
    [{status, 200}, {header, {"Vary", "Accept"}},
     {content, "application/json", ""}].

此时,我的理解是,yaws只生成我的api模块的一个实例并向其发送所有请求。因此,在任何给定时间只能处理一个请求。

有没有办法产生更多的api模块进程并在它们之间传播请求?

或者我应该为每种类型的API请求做更多的appmod?

或者我对雅司病如何运作的理解是根本错误的?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

内部雅司保留了一系列接受者进程。请求将在这些进程上处理。 Yaws不会为每个appmod生成一个新进程,并将给定appmod的所有请求都指向其进程。相反,接受者处理新连接,读取该连接上的请求并分派它们,并发送响应。连接关闭后,由于客户端关闭它,由于HTTP 1.0请求(默认情况下需要在每个请求/响应后关闭连接),或者由于客户端不活动导致服务器关闭它,接受者进程返回池。

上面评论中链接的输出的JPEG图像显示处理所有请求的相同pid可能是由于您的客户端保持连接打开并在同一连接上发送每个新请求,导致相同的服务器进程处理所有那些要求。如果您尝试使用Apache Bench(也称为“ab”)这样的客户端(默认为HTTP 1.0,因此每个请求都有一个新连接),您将看到处理每个请求的不同进程。

顺便说一句,对于appmods要注意的是,如果使用执行尾递归循环的状态保持过程来实现它们,例如gen_server,那么对该appmod的所有请求都将被定向到同一个pid,这是循环过程的pid。换句话说,请求最初将在Yaws acceptor进程中处理,如前所述,但是一旦appmod调用它,它将转换到gen_server进程。将请求序列化到单个进程与Yaws无关,而是与appmod的实现方式无关 - 您可能需要阅读one of my published articles about this以获取更多详细信息。简而言之,不要以这种方式编写appmod,除非您的应用程序可接受此类请求序列化。