我想在各个线程中异步调用函数,每个线程都有一个特定的state
,因此我将消息发送到给定的线程,并让该线程对那些消息进行操作。我想知道的是这些消息最合理的样式是什么。我可以想到三种可能性。 (所有示例均不包括线程机制,以免使其复杂化。)
(defclass state () ())
(defgeneric dispatch (object method args))
(defmethod dispatch ((object state) (method (eql :bazinga)) args)
(destructuring-bind (arg1 arg2) args
(format t "arg1 = ~a, arg2 = ~a~%" arg1 arg2)))
(let ((state (make-instance 'state))
(msg '(:bazinga 10 20))) ; message example
(dispatch state (car msg) (cdr msg)))
(defclass state () ())
(defgeneric bazinga (object arg1 arg2))
(defmethod bazinga ((object state) arg1 arg2)
(format t "arg1 = ~a, arg2 = ~a~%" arg1 arg2))
(let ((state (make-instance 'state))
(msg (list #'bazinga 10 20))) ; message example
(apply (car msg) state (cdr msg)))
2.1基于函数的消息,具有状态分配和通过闭包传递的参数(来自RowPJ的注释)
(defclass state () ())
(defgeneric bazinga (object arg1 arg2))
(defmethod bazinga ((object state) arg1 arg2)
(format t "arg1 = ~a, arg2 = ~a~%" arg1 arg2))
(let ((state (make-instance 'state))
(msg (lambda (obj) (bazinga obj 10 20))))
(funcall msg state))
(defclass state () ()) ; could be a structure instead
(defun state-bazinga (object arg1 arg2)
(format t "arg1 = ~a, arg2 = ~a~%" arg1 arg2))
(let ((state (make-instance 'state))
(msg (list #'state-bazinga 10 20))) ; message example
(apply (car msg) state (cdr msg)))
3.1-与2.1类似,在此跳过。
我不太可能具有任何类型的对象层次结构,因此我觉得这些样式之间没有真正的区别。那是否确实只是个人喜好问题,还是客观利弊?这些样式中的任何一种都可能会更易于使用,或者随着程序的增长而更加受限?我知道这不是一个明确的问题,但是希望它仍然可以合理地明确我的要求。
各种线程中的调用函数
基本模型将是一个等待循环,它监视自己的队列/邮箱并执行放入该队列/邮箱的功能。
将所需的任何功能放入该队列。