卸载没有泄漏线程的HTTP请求

时间:2018-04-17 08:03:40

标签: multithreading clojure future

我需要发出一个经常会失败的HTTP请求,如果结果有效,我对结果完全不感兴趣。另外,我不想等待它返回。

所以,我希望将该调用包装在一个单独的线程中,并确保线程在某些东西阻塞时不会停留。

我目前的做法是这样的:

(defn- call-and-forget [url]
  (let [timeout 250
        combined-timeout (* timeout 2.5)
        f (future
            (try
              (http/delete url
                           {:socket-timeout timeout
                            :conn-timeout   timeout})
              (catch Throwable e
                (printf "Could not call %s: %s"
                        url (.getMessage e)))))]
    (deref f combined-timeout)
    (when-not (future-done? f)
      (future-cancel f))))

我特此将此代码放在Apache 2.0许可证

它使用clj-http来进行调用,使用Future来创建另一个线程。我使用内置池的线程和this thread中的讨论了解这一点。使用我自己的线程池,线程工厂,执行器服务,未捕获的处理程序等添加的复杂程度并不值得。

您是否同意上述代码是一个好的,有效的解决方案,或者您是否看到了更好的方法?

1 个答案:

答案 0 :(得分:1)

看起来不错。你也可以这样做

(when (= :failed (deref f timeout-ms :failed))
  (future-cancel f))