线程之间传递消息的最佳样式?

问题描述 投票:1回答:1

我想在各个线程中异步调用函数,每个线程都有一个特定的state,因此我将消息发送到给定的线程,并让该线程对那些消息进行操作。我想知道的是这些消息最合理的样式是什么。我可以想到三种可能性。 (所有示例均不包括线程机制,以免使其复杂化。)

  1. 基于关键字的消息,带有状态和关键字的分派。
(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))) 
  1. 基于功能的消息,具有分派状态。
(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))
  1. 基于功能的消息,带有“硬编码调度”。
(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类似,在此跳过。

我不太可能具有任何类型的对象层次结构,因此我觉得这些样式之间没有真正的区别。那是否确实只是个人喜好问题,还是客观利弊?这些样式中的任何一种都可能会更易于使用,或者随着程序的增长而更加受限?我知道这不是一个明确的问题,但是希望它仍然可以合理地明确我的要求。

common-lisp
1个回答
0
投票

各种线程中的调用函数

基本模型将是一个等待循环,它监视自己的队列/邮箱并执行放入该队列/邮箱的功能。

将所需的任何功能放入该队列。

© www.soinside.com 2019 - 2024. All rights reserved.