在Common Lisp中创建进程队列



我有一个运行Hunchentoot (CentOS和SBCL)的服务器。当用户提交特定类型的post请求时,将启动子进程(run-program),该进程最多需要4分钟才能完成。如果五个人同时执行特定类型的请求,服务器将耗尽内存,并且所有子进程都将中断。您建议使用什么技术将进程排队并一次运行一个进程?

您可以设置一个工作线程来接收来自消息队列的指令。我过去使用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*))))

最新更新