【发布时间】:2017-06-29 11:06:21
【问题描述】:
你好厄兰格人 :)
这里只是另一个使用该语言的 Erlang 爱好者。我有一个非常简单的 YAWS 应用程序模块,在单个客户端访问时可以正常工作。但是,当我尝试生成多个并发客户端时,其中一些客户端开始接收错误(即使这些客户端的数量非常少,比如 10 个)。知道是什么原因造成的吗?
说明代码:
应用模块
out(Arg) ->
io:format("got something!\n"),
Method = extract_method(Arg),
handle(Method, Arg).
客户
client(SenderPID) ->
case httpc:request(
put,
{
"http://localhost:8080/storageunit",
[],
"application/x-www-form-urlencoded",
""
}, [], []) of
{ error, Reason } -> io:format("Server responded with an error: ~p.\n", [Reason]);
{ ok, _ } -> ok
end,
SenderPID ! 'FINISHED'.
client_spawner(_SenderPID, 0) -> io:format("Done.\n");
client_spawner(SenderPID, Times) ->
spawn(concurrent, client, [SenderPID]),
client_spawner(SenderPID, Times - 1).
我遇到的错误:
服务器响应错误:socket_closed_remotely。
最后一条信息是:
- 10 个并发客户端 - 平均 2 到 5 个错误
- 100-100000 个并发客户端 - 平均 50% 的错误
我认为是我的处理代码导致了它,但在客户端收到 httpc 错误的情况下,服务器甚至没有响应“得到了一些东西!”。
我确定我错过了一些琐碎的事情,你能帮忙吗?
问候, 彼得
【问题讨论】:
-
如果没有更多关于
handle/2在服务器端所做的事情的详细信息,很难回答这个问题。我建议检查 Yaws 日志,看看那里是否有任何相关信息。此外,请确保您的 Yaws 侦听积压设置足够高,以适应您正在尝试的内容,并确保客户端和服务器的最大文件描述符数量设置适当。 -
谢谢。看,问题是 handle/2 甚至没有被调用。我在 github 上的某个地方(一些 repo 中的一些旧问题)读到它可能是由 inets 使用的配置文件引起的。我打算稍微探索一下。
-
是的,刚刚确认。即使我完全排除了等式中的句柄/2,我仍然遇到同样的问题。
-
Yaws 是否收到任何信息,或者这只是客户端问题?
-
它看起来像一个客户端问题。 Yaws 什么也没得到。
标签: concurrency erlang yaws