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的服务器。