Multithreading 返回值

Multithreading 返回值,multithreading,lisp,common-lisp,actor,Multithreading,Lisp,Common Lisp,Actor,这可能是一个愚蠢的问题,或者至少是一个关于演员模型的错误假设,但也许有人可以教育我。假设我设置了一个与示例文档中类似的示例参与者 cl-user> (ql:quickload :cl-actors) :CL-ACTORS cl-user> (use-package :cl-actors) T cl-user> (defactor echo (stream) (message) (format stream "~a~%" message)

这可能是一个愚蠢的问题,或者至少是一个关于演员模型的错误假设,但也许有人可以教育我。假设我设置了一个与示例文档中类似的示例参与者

cl-user> (ql:quickload :cl-actors)
:CL-ACTORS

cl-user> (use-package :cl-actors)
T

cl-user> (defactor echo (stream) (message) 
           (format stream "~a~%" message)
           next)
ECHO

cl-user> (defparameter e (echo :stream *standard-output*))
E

cl-user> (send e "Test message")
Test Message
; No value
为什么会有
;没有值
而不是
NIL
?有没有一种方法可以在不终止actor线程的情况下获取返回值,方法是使用
(bt:join-thread(cl-actors::get-thread e))
(我怀疑这在任何情况下都不能完全满足我的要求)?我特别希望得到返回值,而不是对输出为字符串的
或类似的东西耍花招

如果你介意的话,我试图解决的更一般的问题是,试图将参与者的信息输出到客户端的
cl-who
页面。类似于

(with-html-output (s)
   (:h1 (send e "Test message")))

如果
send
不返回任何内容,这显然不起作用。如果具体问题被证明是愚蠢的,那么欢迎对更一般的问题提出建议。

您将流(
*STANDARD-OUTPUT*
)传递给您的参与者,并将字符串打印到该流中。如果您传递web请求输出流,您将在那里得到打印的字符串。如果您想将数据返回给调用参与者以对其执行某些操作,则应传递其id并将数据发送回调用参与者。

我最后稍微更改了cl参与者,并添加了一个
send-receive
构造,该构造在这种情况下实现了我想要的功能。修改后的代码为(鼓励评论)。其核心是:

(defmethod send-receive ((self actor) message &optional (timeout 0))
  (let ((tmp (make-queue)))
    (send self tmp message)
    (car (dequeue tmp timeout))))

本质上,我们声明一个临时队列,以该队列作为接收方发送消息,然后尝试使用可选超时(
0
表示
永远等待
)。这取决于目标参与者接受一个
发送者
参数,这似乎是一个足够
参与者
y的方法;这就是为什么我在便条中提到了我试图解决的更普遍的问题;让一堆参与者进行交互很好,但我正在尝试将他们的网络连接到Hunchentoot(一个HTTP服务器,它不是参与者,所以
向它发送
消息不是一个解决方案)。我开始觉得,如果我想做这样的事情,我应该编写一个快速的基于actors的服务器。