【发布时间】:2019-08-14 13:31:37
【问题描述】:
https://z0ltan.wordpress.com/2016/09/09/basic-concurrency-and-parallelism-in-common-lisp-part-4a-parallelism-using-lparallel-fundamentals/#channels 的 lparallel 库中关于队列的基本讨论说队列“允许在工作线程之间传递消息”。下面的测试使用一个共享队列来协调一个主线程和一个从属线程,其中主线程只是在退出之前等待从属线程完成:
(defun foo (q)
(sleep 1)
(lparallel.queue:pop-queue q)) ;q is now empty
(defun test ()
(setf lparallel:*kernel* (lparallel:make-kernel 1))
(let ((c (lparallel:make-channel))
(q (lparallel.queue:make-queue)))
(lparallel.queue:push-queue 0 q)
(lparallel:submit-task c #'foo q)
(loop do (sleep .2)
(print (lparallel.queue:peek-queue q))
when (lparallel.queue:queue-empty-p q)
do (return)))
(lparallel:end-kernel :wait t))
这按预期产生输出:
* (test)
0
0
0
0
NIL
(#<SB-THREAD:THREAD "lparallel" FINISHED values: NIL {10068F2B03}>)
我的问题是我是否正确或完全使用 lparallel 的队列功能。看起来队列只是使用全局变量来保存线程共享对象的替代品。使用队列的设计优势是什么?为每个提交的任务分配一个队列(假设任务需要通信)通常是一种好习惯吗?感谢您提供更深入的见解。
【问题讨论】:
标签: multithreading common-lisp message-queue