把协作写成发送与接收

多个活动合作时,可以直接读写同一份内存,也可以把需要的信息发送出去。消息传递让交换成为程序中的显式动作,例如一个任务发送计算请求,另一个返回结果。发送者与接收者各自的执行过程因而可以分开描述,再由通信规则把它们联系起来。

参考:[1] [2]

同步通道与有缓冲通道

通道可以约束所传数据的类型,并把通信与同步结合。以Go为例,无缓冲通道的成功交换需要发送和接收配合;有缓冲通道则允许在容量范围内暂存数据。两种方式改变的是等待条件,不能只把缓冲大小看成无关执行顺序的存储参数。

参考:[2]

邮箱式进程通信

Erlang进程由进程标识联系,发送操作把消息交给目标,接收过程再从消息队列选择符合条件的内容。这样的邮箱模型与双方必须同时就绪的交接并不相同。接收者还要决定如何处理未匹配的消息;能发送成功也不能自动证明另一端已经完成请求。

参考:[1]

消息还需要协议

完整协作通常需要约定消息格式、请求标识、回复与结束信号。请求可能超时,接收者可能退出,重复发送也可能造成重复操作,因此程序要明确确认和失败处理。消息传递把通信放到了可观察的位置,但不会替应用自动定义业务层的正确顺序或恰好执行一次的保证。

参考:[1] [2]