我有以下内容:
(defun serve (&key (port 80) (handler #'IDENTITY))
(WITH-OPEN-SOCKET
(socket :LOCAL-PORT port
:LOCAL-HOST "localhost"
:CONNECT :PASSIVE
:REUSE-ADDRESS t)
(flet ((handle-connection ()
(with-open-stream
(stream (ACCEPT-CONNECTION socket :wait t))
(funcall handler stream))))
(loop (handle-connection)))))
当一个连接进来时,它被接受并且一个流被传递给处理程序。进程在处理程序上等待(阻塞)。所以当处理程序返回时处理下一个连接。
解决方法是每个连接有一个进程(/线程),因此新连接不必等待处理程序完成对较早连接的处理。
我尝试这样做:
(PROCESS-RUN-FUNCTION (gensym)
(lambda () (funcall handler stream)))
代替 just (funcall handler stream)
,但这最终会出错,因为在调用处理程序时流不可用。显然,因为 with-open-stream 到那时已经退出,并且流超出了范围,因此(也许?)GC'd。
然后我尝试了:
(loop
(PROCESS-RUN-FUNCTION (gensym)
(lambda ()
(format t "new process ")
(handle-connection))))
而不是 just (loop (handle-connection))
,它以循环的速度运行生成新进程,因为套接字部分的等待不再阻止执行。
创建单独的线程/进程以处理同一个套接字上的许多连接的正确方法是什么?