如何在ABCL中产生一个后台(命名)子进程/线程?也就是说,我想生成子进程(或线程)以在后台运行,并让顶级评估留给其他进程使用。

使用(apropos'进程/线程),我发现了未列出的功能,例如下面列出的功能,但是我无法弄清楚语法。我正在寻找要遵循/修改的运行示例代码。我似乎已经使用以下make-process函数创建了一个进程,但是尝试杀死它时出现错误,并且它在前台运行。 ABCL手册中没有用于制造过程的条目。 MAKE-THREAD已列出,但未记录。

带有“未记录”名称的ABCL手册中列出的所有功能的文档/示例在哪里? (还有那些发现有proposos的人吗?)

作为一个单独但相关的问题,是否存在一个在线的ABCL特定运行代码示例存储库,其中涵盖了诸如此类的极端情况?

在其他常见问题中,我将使用类似以下的函数:

(activate-process *initial-process*)

或者
#+(:and MULTITASKING :lucid)
(defun mpd (&optional (reinit nil))
  (user::make-process :name "Pdraw-proc" :function #'pd::pdraw :args (list reinit)))

在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)


THREADS:MAKE-THREAD (fbound)
THREADS:DESTROY-THREAD (fbound)


(make-two-way-stream ...)

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

在此先感谢您提供指针或代码。

最佳答案

我将ABCL与roswell结合使用,因此很容易与quicklisp结合使用,但是还有一个针对that的项目,但我认为您可以轻松地在ABCL中使用quicklisp或加载库。您可以在ABCL上加载很多来自quicklisp的库,不幸的是,并非全部(Quicklisp已通过linux和SBCL进行了测试),但是为了并发,您可以加载两个我通常使用bordeaux-threads的出色的库(常见的威胁库)。 Common Lisp)和Chanl一个将port转换为Common Lisp的库。还有其他您可以尝试的方法,但是我不确定它们是否可以并行运行,分类器...

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

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 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)

它还实现了mailbox威胁来将消息传递给线程

09-05 12:21