【问题标题】:core.async: terminate go loop after timeoutcore.async:超时后终止go循环
【发布时间】:2017-04-27 22:21:10
【问题描述】:

我有一个函数可以处理来自共享通道的值流并查找满足特定谓词的值:

(defn find-my-object [my-channel]
  (go-loop []
    (when-some [value (<! my-channel)]
      (if (some-predicate? value)
        value
        (recur)

现在我希望这个函数在等待超时后返回一些“失败”值,我已经这样实现了:

(alts! [(find-my-object my-channel) (timeout 1000)])

这样做的问题是上面的go-loop在超时后继续执行。我希望find-my-objectmy-channel 中提取值 搜索正在进行中,但我不想在超时时关闭my-channel,因为它已在其他一些地方使用。实现此功能的惯用方式是什么?

【问题讨论】:

    标签: clojure core.async


    【解决方案1】:

    find-my-object 内部的超时通道读取,而不是在它外部。您可以根据需要对其进行硬编码,或者使该函数采用第二个通道参数,即“请停止阅读”通道。然后你可以给它传递一个超时通道来获得你现在想要的行为,或者传递给它一些其他类型的通道来以不同的方式控制它。

    【讨论】:

    • 有没有办法告诉超时通道已关闭并且应该终止循环?没有“关闭”?功能或任何东西。
    • alts! 返回给您它从哪个频道读取。如果那是超时通道,则超时已过期。
    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 2015-12-10
    • 2011-09-26
    • 2020-09-03
    • 1970-01-01
    • 2016-10-06
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多