代码之家  ›  专栏  ›  技术社区  ›  Chris Murphy

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

  •  1
  • Chris Murphy  · 技术社区  · 9 年前

    如果您查看 async webinar 您将看到一些频道的大小为1,但大多数频道的大小是0。

    大小1似乎用于两个事件可能完全同时到达的情况(如果有不止一个源),或者事件可能很快到达的情况。例如,使用 EventType.KEYDOWN 事件用户可以按住键快速生成事件,而使用 EventType.CLICK 当按键再次上下移动时,事件之间会有一个明确的暂停。

    背后的目的是什么 (chan 1) 而不是 (chan) 只是为了让演示“不那么笨重”,效果更流畅?如果所有通道的缓冲区大小都为0,他演示的内容是否仍然有效?推理机是否依赖于速度-即。 (通道1) 这主要是为了让机器速度慢的人受益吗?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Daniel Compton    9 年前

    如果您使用没有缓冲区的chan,则对该chan的任何put都将停止,直到出现相应的take。使用带有缓冲区1的chan让“推杆”继续运行,直到第二次推杆。在那一点上,它会停下来,直到有人从缓冲区取走。

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

    使用1或0的缓冲区或不使用缓冲区之间的选择不应依赖于机器(我认为?),这将取决于核心的逻辑性质。您创建的异步状态机,以及两个状态机是否需要在某个点同步( (chan 0) ),或者如果他们能够更独立地工作( (chan 1) ).