在 Common Lisp 中创建进程队列
Creating A Process Queue in Common Lisp
我有一个服务器 运行ning Hunchentoot(CentOS 和 SBCL)。当用户提交特定类型的 post 请求时,将启动一个子流程(运行-程序),最多可能需要四分钟才能完成。如果五个人同时执行该特定类型的请求,服务器 运行 内存不足,所有子进程都会中断。您建议使用什么技术来对进程进行排队并运行一次一个地处理它们?
您可以设置一个从消息队列接收指令的工作线程。我过去曾使用 chanl
来处理类似的事情,但还有其他几种选择。
(defvar *worker-queue* '())
(defvar *worker-queue-mutex* (sb-thread:make-mutex :name "worker-queue-lock"))
(defvar *worker-queue-semaphore* (sb-thread:make-semaphore :name "worker-queue-semaphore" :count 0))
(defvar *worker-thread*)
(defun worker-queue-function ()
(sb-thread:with-mutex (*worker-queue-mutex*)
(let ((popped-worker-queue-item (pop *worker-queue*)))
(do-something-with popped-worker-queue-item))))
(defun make-worker-thread ()
(setq *worker-thread* (sb-thread:make-thread (lambda ()
(loop
(sb-thread:wait-on-semaphore *worker-queue-semaphore*)
(worker-queue-function)))
:name "worker-thread")))
(defun add-item-to-worker-queue (item-to-add-to-worker-queue)
(sb-thread:with-mutex (*worker-queue-mutex*)
(setq *worker-queue* (append *worker-queue* (list item-to-add-to-worker-queue)))
(sb-thread:signal-semaphore *worker-queue-semaphore*))))
我有一个服务器 运行ning Hunchentoot(CentOS 和 SBCL)。当用户提交特定类型的 post 请求时,将启动一个子流程(运行-程序),最多可能需要四分钟才能完成。如果五个人同时执行该特定类型的请求,服务器 运行 内存不足,所有子进程都会中断。您建议使用什么技术来对进程进行排队并运行一次一个地处理它们?
您可以设置一个从消息队列接收指令的工作线程。我过去曾使用 chanl
来处理类似的事情,但还有其他几种选择。
(defvar *worker-queue* '())
(defvar *worker-queue-mutex* (sb-thread:make-mutex :name "worker-queue-lock"))
(defvar *worker-queue-semaphore* (sb-thread:make-semaphore :name "worker-queue-semaphore" :count 0))
(defvar *worker-thread*)
(defun worker-queue-function ()
(sb-thread:with-mutex (*worker-queue-mutex*)
(let ((popped-worker-queue-item (pop *worker-queue*)))
(do-something-with popped-worker-queue-item))))
(defun make-worker-thread ()
(setq *worker-thread* (sb-thread:make-thread (lambda ()
(loop
(sb-thread:wait-on-semaphore *worker-queue-semaphore*)
(worker-queue-function)))
:name "worker-thread")))
(defun add-item-to-worker-queue (item-to-add-to-worker-queue)
(sb-thread:with-mutex (*worker-queue-mutex*)
(setq *worker-queue* (append *worker-queue* (list item-to-add-to-worker-queue)))
(sb-thread:signal-semaphore *worker-queue-semaphore*))))