Thu*_*oot 7 lisp multithreading common-lisp abcl
如何产卵关闭后台(命名)子进程/线程中ABCL?也就是说,我想生成子进程(或线程)以在后台运行并让顶级评估免费用于其他处理.
使用(apropos'进程/线程)我发现了下面列出的未记录的函数,但我无法弄清楚语法.我正在寻找运行示例代码来遵循/修改.我似乎已经创建了一个具有以下make-process函数的进程,但是当我尝试杀死它时出现错误,并且它在前台运行.ABCL手册中没有关于make-process的条目.列出了MAKE-THREAD,但没有记录.
ABCL手册中列出的所有功能的文档/示例在哪里有" 未记录 "的名称?(也是那些与apropos一起发现的?)
作为一个单独但相关的问题,是否有一个在线ABCL特定运行代码示例的存储库,涵盖了像这样的边缘案例问题?
在其他常见的lisps我会使用如下函数:
(activate-process *initial-process*)
Run Code Online (Sandbox Code Playgroud)
要么
#+(:and MULTITASKING :lucid)
(defun mpd (&optional (reinit nil))
(user::make-process :name "Pdraw-proc" :function #'pd::pdraw :args (list reinit)))
Run Code Online (Sandbox Code Playgroud)
在ABCL,我已经糊里糊涂了不远处:
CL-USER> (setf uu (make-thread (my-reader))) <-- runs at the top level / hogs read loop
CL-USER> (setf jj (system::%make-process (foo)))
#S(SYSTEM:PROCESS :JPROCESS 3 :INPUT NIL :OUTPUT NIL :ERROR NIL)
CL-USER> jj
#S(SYSTEM:PROCESS :JPROCESS 3 :INPUT NIL :OUTPUT NIL :ERROR NIL)
SYSTEM::MAKE-PROCESS (fbound)
SYSTEM::%PROCESS-KILL (fbound)
SYSTEM::%MAKE-PROCESS (fbound)
Run Code Online (Sandbox Code Playgroud)
和
THREADS:MAKE-THREAD (fbound)
THREADS:DESTROY-THREAD (fbound)
Run Code Online (Sandbox Code Playgroud)
和
(make-two-way-stream ...)
Run Code Online (Sandbox Code Playgroud)
[为线程创建必要流的语法/示例可能?]
提前感谢指针或代码.
我将 ABCL 与roswell一起使用,因此它很容易与 Quicklisp 结合使用,但也有一个项目,但我认为您可以轻松地使用 Quicklisp 或在 ABCL 中加载库。您可以在 ABCL 上加载很多来自 Quicklisp 的库,不幸的是不是全部(Quicklisp 在 Linux 和 SBCL 上进行了测试),但是为了并发性,您可以加载两个我通常使用bordeaux-threads 的优秀库(常见威胁) common lisp 中的库)和Chanl一个将 go 通道移植到 common lisp 的库。还有其他一些你可以尝试,但我不确定它们是否可以并行工作,cl-actors ...
让我们用这个库做一个例子:
CL-USER> (lisp-implementation-type)
"Armed Bear Common Lisp"
CL-USER> (lisp-implementation-version)
"1.5.0"
"Java_HotSpot(TM)_64-Bit_Server_VM-Oracle_Corporation-1.8.0_162-b12"
"x86_64-Mac_OS_X-10.12.6"
CL-USER> (ql:quickload 'bt-semaphore)
To load "bt-semaphore":
Load 1 ASDF system:
bt-semaphore
; Loading "bt-semaphore"
[package bt-semaphore]
(BT-SEMAPHORE)
CL-USER> bt:*supports-threads-p*
T
CL-USER> (defparameter *counter* 0)
*COUNTER*
CL-USER> (defun test-update-global-variable ()
(bt:make-thread
(lambda ()
(sleep 10)
(incf *counter*)))
*counter*)
TEST-UPDATE-GLOBAL-VARIABLE
CL-USER> *counter*
0 (0 bits, #x0, #o0, #b0)
CL-USER> (test-update-global-variable)
0 (0 bits, #x0, #o0, #b0)
CL-USER> *counter*
0 (0 bits, #x0, #o0, #b0)
CL-USER> (+ 2 3)
5 (3 bits, #x5, #o5, #b101)
CL-USER> (format t "I'm wainting for counter")
I'm wainting for counter
NIL
CL-USER> (format t "let'see the counter value ~a~%" *counter*)
let'see the counter value 1
NIL
CL-USER> (ql:quickload :chanl)
To load "chanl":
Load 1 ASDF system:
chanl
; Loading "chanl"
(:CHANL)
CL-USER> (chanl:pcall (lambda () (sleep 10) (incf *counter*)))
#<CHANL:TASK Anonymous task [ALIVE] {2360938E}>
CL-USER> *counter*
1 (1 bit, #x1, #o1, #b1)
CL-USER> ;; waiting
; No values
CL-USER> *counter*
2 (2 bits, #x2, #o2, #b10)
Run Code Online (Sandbox Code Playgroud)
请注意,这只是示例,全局变量不能很好地用于威胁,还可以查看库以获取进一步的文档,这应该可以工作,而且您在 ABCL 中很容易使用 java 库,所以也许您可以使用akka actor,或其他java并发库
另外,正如您所指出的,ABCL 有一个威胁包,它很容易使用,如下所示:
CL-USER> (threads:make-thread (lambda () (sleep 10) (incf *counter*)) :name 'patata)
#<THREAD "PATATA" {49998577}>
CL-USER> *counter*
2 (2 bits, #x2, #o2, #b10)
CL-USER> ; wait
; No values
CL-USER> *counter*
3 (2 bits, #x3, #o3, #b11)
Run Code Online (Sandbox Code Playgroud)
它还实现了邮箱威胁以将消息传递给线程