2024 Clojure状态调查!分享你的想法。

欢迎!请查看关于页面以获取更多关于此功能的信息。

0
 AVR Refs、agents、atoms
编辑
(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. 
 AVR
你一定会喜欢`clojure.core/pmap` - 但如果我正确理解你的问题,sleep可能是放在`f`中的?
 AVR
不幸的是,并非如此。它勇敢地返回向量。我不想重新发明pmap  

1 答案

+2

很难确切知道您的问题是什么,但我猜您希望如果未来执行没有在特定时间内完成,就停止执行。

当然,.get 不能这样做,.get 的超时是对等待未来结果的操作的超时,而不是对未来本身的超时。

您可以将 .get 与超时和未来取消结合起来,也许能得到类似的结果,但是即使未来取消也不能保证停止正在运行的线程。而且 JVM 作者一直在移除停止正在运行的线程的方法。

最好的方法是将正在运行的过程编写成能够与关闭合作,例如等待某些关闭信号,或者达到某个时间限制后停止执行。这需要在进程之间进行大量通信,有时还要求进程能够同时等待多个线程(等待来自另一个进程的消息,同时也等待停止信号)。core.async 为此提供了一些功能强大的原语。

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

我现在开始看清楚了一些——或多或少。谢谢。
...