Erlang 如何在yaws中处理到out(A)的多个请求?

Erlang 如何在yaws中处理到out(A)的多个请求?,erlang,yaws,erlangweb,Erlang,Yaws,Erlangweb,最近,我开始在erlang&Yaws中开发RESTAPI。 我不明白yaws和我的模块如何处理多个请求 我有api模块收集所有请求: appmods = </, api> 在这一点上,我的理解是yaws只生成api模块的一个实例,并将所有请求发送到那里。因此,在任何给定时间只能处理一个请求 有没有办法产生更多的api模块进程并在它们之间传播请求 或者我应该为每一种类型的API请求做更多的AppMod吗 或者我对雅司病如何工作的理解根本是错误的 感谢您的帮助。Yaws内部保留一个接受

最近,我开始在erlang&Yaws中开发RESTAPI。 我不明白yaws和我的模块如何处理多个请求

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

appmods = </, api>
在这一点上,我的理解是yaws只生成api模块的一个实例,并将所有请求发送到那里。因此,在任何给定时间只能处理一个请求

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

或者我应该为每一种类型的API请求做更多的AppMod吗

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


感谢您的帮助。

Yaws内部保留一个接受程序池。请求是在这些进程上处理的。Yaws不会为每个appmod生成一个新进程,并将给定appmod的所有请求定向到其进程。相反,接受者处理一个新连接,读入该连接上的请求并分派它们,然后发送响应。一旦连接关闭,无论是由于客户端关闭连接,还是由于存在“connection:close”HTTP头,还是由于HTTP 1.0请求(默认情况下需要在每个请求/响应后关闭连接),或者是由于客户端不活动导致服务器关闭连接,接受器进程都会返回池

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


顺便说一句,appmod需要注意的是,如果您使用执行尾部递归循环的状态保持过程(如
gen_server
)来实现它们,那么对该appmod的所有请求都将被定向到相同的pid,这是循环过程的pid。换句话说,请求最初将在Yaws-acceptor进程中处理,如前所述,但一旦appmod调用它,它将进入
gen_服务器
进程。将请求序列化到单个进程与Yaws无关,而是与appmod的实现方式有关—您可能需要阅读更多详细信息。简而言之,除非您的应用程序可以接受这种请求序列化,否则不要以这种方式编写AppMod。

为什么您认为Yaws不会为每个连接生成进程?若您发出两个并发请求,您会在控制台中看到什么?这可能是底层进程池
-module(api).
out(_Arg) ->
    io:format("my pid  ~p ~n", [self()]),
    loop(200000000),
    [{status, 200}, {header, {"Vary", "Accept"}},
     {content, "application/json", ""}].