首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ABCL (武装熊) LISP中,如何创建后台子进程/后台线程?

在ABCL (武装熊) LISP中,如何创建后台子进程/后台线程?
EN

Stack Overflow用户
提问于 2018-05-16 03:37:13
回答 2查看 223关注 0票数 7

如何在ABCL中生成背景(命名)子进程/线程?也就是说,我希望生成子进程(或线程)在后台运行,并将顶级评估留给其他处理。

使用(恰巧是进程/线程),我发现了如下所列的无文档函数,但我无法理解语法。我正在寻找运行示例代码的代码来遵循/修改。我似乎创建了一个具有以下make-process函数的进程,但当我试图杀死它时会出现一个错误,它将在前台运行。ABCL的make-process手册中没有条目。MAKE-线程列出了,但没有文档化。

在ABCL手册中列出的所有功能的文档/示例在哪里?(也是与意外发现的?)

作为一个单独但相关的问题,是否有一个专门运行ABCL的代码示例的存储库,这些示例涵盖了像这样的边用例问题?

在其他常见的lisps中,我会使用如下函数:

代码语言:javascript
复制
(activate-process *initial-process*)

代码语言:javascript
复制
#+(:and MULTITASKING :lucid)
(defun mpd (&optional (reinit nil))
  (user::make-process :name "Pdraw-proc" :function #'pd::pdraw :args (list reinit)))

在ABCL中,我一直在胡乱地走得不远:

代码语言:javascript
复制
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)

代码语言:javascript
复制
THREADS:MAKE-THREAD (fbound)
THREADS:DESTROY-THREAD (fbound)

代码语言:javascript
复制
(make-two-way-stream ...) 

可能是为线程创建必要的流的语法/示例?

预先感谢您的指针或代码。

EN

回答 2

Stack Overflow用户

发布于 2018-05-16 08:54:59

我在罗斯韦尔中使用ABCL,所以在使用quicklisp时很容易使用,但是也有一个项目,但是我认为您可以很容易地在ABCL中使用quicklisp或load库。您可以在ABCL上加载许多库,这些库都是从quicklisp加载的,不幸的是,并不是所有库都可以加载(Quicklisp是在linux和SBCL上测试的),但是为了并发性,您可以加载我通常使用的波尔多丝 (公共lisp中的常见威胁库)和香奈尔 (一个将端口引导到公共lisp的库)。还有其他你可以尝试的,但我不确定他们是否能发挥作用,演员.

让我们用这个库来做一个例子:

代码语言:javascript
复制
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)

请注意,这只是一个示例,一个全局变量不是很好地用于威胁,还可以查看库以获得更多的文档,这应该是可行的,还可以在ABCL中轻松地使用java库,所以您可能可以使用akka参与者或其他java并发库。

此外,当您的ABCL有一个用于威胁的包时,它很容易使用,如下所示:

代码语言:javascript
复制
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)

此外,它还实现了将消息传递给线程的信箱威胁。

票数 4
EN

Stack Overflow用户

发布于 2018-05-17 06:55:00

在Vibhu的鼓励下,我找到了Anquegi建议的相同的本地解决方案。谢谢你的名字,阿格!

代码语言:javascript
复制
CL-USER> (lisp-implementation-type)
"Armed Bear Common Lisp"
CL-USER> (lisp-implementation-version)
"1.3.3"
"Java_HotSpot(TM)_64-Bit_Server_VM-Oracle_Corporation-1.8.0_161-b12"
"amd64-Windows_7-6.1"
CL-USER> 


(setf my-val 1)

;;; Output to *standard-output* for Inferior Lisp, so careful with SLIME:
(defun make-my-thread ()
  (setf q
    (threads:make-thread
     #'(lambda ()
         (format t "I am alive!~%")
         (sleep 15)
         (format t "Goodbye Cruel World~%")
       (setf my-val (1+ my-val))))))


;;; Works, but takes a while: 
(defun kill-it () (threads:destroy-thread q))

(defun alivep () (THREADS:THREAD-ALIVE-P q))

(make线程)在后台运行,而不占用标准输入。

我的-val可以被查询并且直到睡眠后才被设置。

(alivep)返回T,直到线程完成,或者在调用(杀死-it)之后的几秒钟,然后是零。

因此,这个最小的功能现在允许我在后台运行线程时具有很大的灵活性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50362129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档