2024 Clojure 状态调查中分享您的想法!

欢迎!请访问关于页面了解有关本站运作的一些更多信息。

0
引用、代理、原子
编辑
(defn tid []                                                        
  [(.getName (Thread/currentThread))                                                        
   (.getId (Thread/currentThread))])

   (defn atomize                                                   
  [f data]                                                                                  
  (let [atomix (atom [])                                                                    
        pool (Executors/newFixedThreadPool 12)                                              
        tasks (map                                                                          
               (fn [datum]                                                                  
                 (fn []                                                                     
                   (swap! atomix conj [(f datum) (tid)])))                                  
               data)]                                                                       
    (doseq [future (.invokeAll pool tasks)]                                                 
      (.get future  10 TimeUnit/MILLISECONDS ))                                             
    (.shutdown pool)                                                                        
    @atomix))




I can't figure out where to place a `sleep` to force a timeout. 
你一定会喜欢 `clojure.core/pmap` - 但如果我们正确理解了您的问题,睡眠可能需要在 `f` 中进行?
不幸的是,并不是这样。它勇敢地返回了向量。我不想重写 pmap。

1 个答案

+2
by

很难确切地说你的问题是什么,但我猜你希望在未来执行在指定时间未完成时停止。

当然,.get 并不执行这个操作,.get 的超时是对等待未来操作结果的超时,而不是对未来的超时。

你可以将 .get 与超时和未来取消结合使用,可能会得到类似的效果,但即使未来取消也不能保证停止运行的线程。并且 JVM 的作者们一直在移除不合作停止运行线程的方式。

最好的方法是将正在运行的进程编写成可以与其关闭方式配合,例如等待某些关闭信号或达到一定时间限制后停止执行。这需要在进程之间进行相当多的通信,有时还需要进程能够同时等待多个线程。core.async 为此提供了一些很好的原始工具。

by
“……未来的超时……”

我现在开始明白了——或多或少。谢谢。
...