代码之家  ›  专栏  ›  技术社区  ›  David Tonhofer

你能在Clojure中使用'send'和'send off'混合代理操作提交吗?会发生什么?

  •  0
  • David Tonhofer  · 技术社区  · 5 年前

    我知道陪审团的“代理人”是 ref 添加了“操作”的工作队列。动作是用 裁判 的值位于第一个位置,可以传递其他参数。操作返回的新值 裁判 . 因此,“代理”是一种计算 参考:=(动作动作动作动作动作_°动作_[1]_°动作_[0])(参考) 可能有动作诱发的副作用。

    电话 (send-off agent action & args) 结果 action 由系统分配给 agent (据我所知,从一个可增长的线程池中,一旦代理的队列为空,该线程要么停止,要么返回池中)。

    电话 (send agent action & args) 结果 行动 由固定系统池中的线程排队进行异步处理,在固定系统池中,线程在属于多个代理的操作之间切换。在这种情况下, 行动 应避免阻塞或过度弯曲螺纹。

    到目前为止还不错,但是如果一些行动被排成一列,会发生什么呢? send 还有一些 send-off 给同一个探员?当系统将操作从代理队列中出列时,是否会在两种处理模式之间切换?

    2 回复  |  直到 5 年前
        1
  •  2
  •   Alan Thompson    5 年前

    唯一的区别是 send send-off 是使用的线程组。代理和线程的调度是(必须)单独完成的。

    首先有两个线程组的唯一原因是 发送 可用于“快速运行”任务(如内存/非网络操作)。“慢”的任务(例如网络呼叫)应该使用 发送 所以他们不会阻止“快速”任务。

    “快”和“慢”的定义是模糊的,由用户决定。注意这里的语言差异 发送 VS 发送 (对于磁盘或网络I/O等“潜在阻塞操作”):

    https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/send


    更多信息: https://clojure.org/reference/agents

    所有代理的操作在线程中的线程之间交错。 池。在任何时间点,每个代理最多只能执行一个操作 执行。从另一个单一代理发送到代理的操作,或者 线程将按发送顺序出现,可能是交错的 将操作从其他源发送到同一个代理。发送 应用于CPU受限的操作,而发送是 适用于可能阻止IO的操作。

        2
  •  2
  •   amalloy    5 年前

    我想你有 send send-off 向后的: 发送 使用固定大小的线程池,而 发送 使用无边界线程池。

    但是这对代理没有任何区别:操作被添加到代理的单个队列中,并附上一个小注释,说明当代理准备好执行它们时,应该如何执行它们。代理总是按顺序执行这些操作,一次一个。

    自己看看: dispatch(IFn, ISeq, Executor) 转发到 dispatch(Action) ,转发至 enqueue(Action) .