go的changel编程模式是类似于actor的一种编程模型,这个模型也存在一些问题:
1、如果多个actor存在同生共死的依赖关系,在析构过程中,父actor通知子actor关闭,由于协程actor模型处理信息延迟响应的处理,在资源释放过程中有延后,这样会出现在释放的过程可能持续好几秒的时间,过程中就有可能有新请求接入。
2、协程的运行是顺序执行的,虽然可以通过select同时监听多个管道,但是如果在接收到一个管道,在处理过程中阻塞(sleep或io阻塞),会导致这个协程被阻塞,这样的设计是有导致的,是为了不破损执行的栈等上下文,比如接收到管道a,处理进行阻塞,在阻塞过程中又接收到管道a,如果进行处理的话,就会破坏到之前阻塞的栈,导致阻塞恢复后运行混乱。
正因为这样又会加剧1的问题,具体子actor在阻塞过程中,就不会处理父actor通过管道发过来的退出信号。
3、协程是没有强制退出的机制的,设计哲学是通过协作而不是强制来管理并发。这是为了避免潜在的资源泄漏和不确定的状态。