Wookie Common Lisp 服务器是否并行处理请求?

Does Wookie Common Lisp server process requests in parallel?

我有一个基于 Wookie 的应用程序接受 nginx 背后的请求。该应用程序运行一般,但我 运行 遇到了一些并行请求问题。例如,当应用程序接受一个长 运行 请求(R1)以从数据库中的数据集(mongodb,通过 cl-mongo)生成报告时,它会出现对在对 R1 的响应开始通过网络发送之前进入的任何后续请求 (R2) 没有响应。

客户端报告在与 R2 的服务器通信时出错,但在服务器完成与 R1 的通信并最终发送响应后,它尝试处理 R2(从调试输出中可以明显看出)——执行正确的路由等(只是太迟了)。

在请求处理例程周围放置 blackbird promises 并没有帮助(并且可能是过度的,因为 Wookie 被设计为异步)。

那么处理这个问题的正确方法是什么?我可能不介意客户长时间等待他们的响应(通过很长的超时),但并行处理短请求会好得多。

cl-async 的底层库(libevent2、libuv)的思想,是利用一个任务(请求)的IO 等待时间换取另一个任务(请求)的CPU 时间。所以它只是一种不浪费IO等待时间的机制。并行发生的唯一事情是 IO,一次最多使用 CPU 的任务(每个 thread/process 取决于实现)。

如果您的请求平均需要 x 毫秒 CPU 时间,那么一旦您有 n 个并行请求,其中 n 是内核,无论您使用线程服务器还是基于事件的服务器,您的 n+1st 请求都必须等待至少 x 毫秒。

您当然可以生成更多服务器进程并使用负载平衡来利用所有可用内核。