对于某些类型的用户生成的事件,通道缓冲区大小是否必不可少?

时间:2016-01-29 14:22:49

标签: clojurescript core.async

如果查看async webinar的代码,您会看到某些频道的大小为1,但大多数都是0。

大小1似乎用于两个事件可以在完全相同的时间到达(有多个源)的情况,或者事件可能非常快速地进入。例如,对于EventType.KEYDOWN事件,用户可以按住键以快速生成事件,而使用来自一个按钮的EventType.CLICK事件,事件之间会有一个明确的暂停,因为键处于上升状态再次下来。

(chan 1)而不是(chan)背后的目的只是让演示'不那么笨重',效果更平滑吗?如果所有通道的缓冲区大小为0,那么他所演示的内容是否仍然可以正常工作?推理机速度是否依赖 - 即(chan 1)主要是为了慢机器人的利益?

1 个答案:

答案 0 :(得分:1)

如果您使用没有缓冲区的chan,那么对该chan的任何放置都会停止,直到有相应的值。使用带有缓冲区1的chan让“推杆”继续运行,直到它进行第二次放置。此时它会停放,直到有人从缓冲区中取出。

举一个具体的例子,如果放置状态机(去块或线程)需要在将值放到通道上之后但在它可能已被接收状态机处理之前运行一些副作用,那么你应该使用一个缓冲区。

使用1或0的缓冲区之间的选择不应该取决于机器(我认为?),它取决于你创建的core.async状态机的逻辑性质,以及是否有两个状态机需要在某个时间点((chan 0))进行同步,或者它们是否可以更独立地工作((chan 1))。