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

Common lisp Wookie Common Lisp服务器是否并行处理请求?,common-lisp,sbcl,Common Lisp,Sbcl,我有一个基于Wookie的应用程序在nginx后面接受请求。这个应用程序一般都能工作,但我遇到了一些并行请求的问题。例如,当应用程序接受一个长时间运行的请求(R1)以从数据库中的数据集(mongodb,通过cl mongo)生成报告时,它将对在R1响应开始通过网络发送之前传入的任何后续请求(R2)表现为无响应 客户端报告与R2服务器通信时出错,但在服务器使用R1完成并最终发送响应后,它会尝试处理R2(从调试输出中可以明显看出)——执行正确的路由等(只是太晚了) 在请求处理例程中加入blackbi

我有一个基于Wookie的应用程序在nginx后面接受请求。这个应用程序一般都能工作,但我遇到了一些并行请求的问题。例如,当应用程序接受一个长时间运行的请求(R1)以从数据库中的数据集(mongodb,通过cl mongo)生成报告时,它将对在R1响应开始通过网络发送之前传入的任何后续请求(R2)表现为无响应

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

在请求处理例程中加入blackbird承诺没有任何帮助(而且可能是过度的,因为Wookie是异步设计的)


那么正确的处理方法是什么呢?我可能可以接受客户端等待很长时间的响应(通过很长的超时),但最好是并行处理短请求。

cl async的底层库(libevent2,libuv)的思想是使用一个任务(请求)的IO等待时间作为另一个任务(请求)的CPU时间。因此,这只是一种不浪费IO等待时间的机制。唯一并行发生的事情是IO,一次最多使用CPU执行一个任务(每个线程/进程取决于实现)

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


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

您是说cl async不是天生的多线程,所以从理论上讲,将并行请求的执行包装到线程中应该可以解决问题?是的,不是天生的多线程,在某一点上是这样的。我们的请求处理时间越长(无论是由于cpu使用还是阻塞io),您必须投入的资源(核心)就越多,假设每次服务的请求数量不变。另一个可能值得研究的问题是:您的数据库IO是否阻塞,或者cl mongo是否也使用cl async?据我所知,cl mongo不使用cl async,但似乎是多线程的。您好,这里是Wookie的作者(很抱歉这么晚才发表评论)。伍基的专长是处理IO。接受请求、通过HTTP/TCP调用API、与数据库对话等。如果大量请求需要CPU密集型任务,那么您可能真的需要查看Hunchentoot。如果只有少数人使用CPU,那么您需要将它们发送到线程池(如lparallel),这样它们就不会阻塞事件循环/IO线程。查看更多信息!安德鲁,谢谢。最后,我使用了一个简单的DIY线程队列来处理长时间运行的请求,它现在可以工作了,所以您的建议是正确的。