<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 并發 Wikipedia上面對于并發有個很精準的定義: "Concurrency is a property of systems in which several computations are executing and overlapping in time, and potentially interacting with each other. The overlapping computations may be executing on multiple cores in the same chip, preemptively time-shared threads on the same processor, or executed on physically separated processors." 并發編程的主要挑戰就在于管理對于共享的、可修改的狀態的修改。 通過鎖來對并發進行管理是非常難的。我們需要決定哪些對象需要加鎖以及什么時候加鎖。這還不算完, 每次你修改代碼或者添加新的代碼的時候你都要重新審視下你的這些決定。如果一個開發人員忘記了去鎖一個應該加鎖的對象,或者鎖的時機不對,一些非常糟糕的事情就會發生了。這些糟糕的事情包括 [死鎖](http://en.wikipedia.org/wiki/Deadlock) 和 [競爭條件](http://en.wikipedia.org/wiki/Race_condition) ;另一個方面如果你鎖了一個不需要鎖的對象,那么你的系統的性能則會下降。 為了更好地進行并發編程是很多開發人員選擇Clojure的原因。Clojure的所有的數據都是只讀的,除非你顯示的用Var, [Ref](http://java.ociweb.com/mark/clojure/article.html#Refs) ,Atom和Agent來標明它們是可以修改的。這些提供了安全的方法去管理共享狀態,我們會在下一節:“引用類型”里面更加詳細地介紹。 用一個新線程來運行一個Clojure函數是非常簡單的,不管它是內置的,還是自定義的, 不管它是有名的還是匿名的。關于這個更詳細的可以看上面有關和Java的互操作的討論。 因為Clojure代碼可以使用java里面的所有的類和接口, 所以它可以使用Java的并發能力。Java領域一個很棒的有關java并發編程的書: " [Java Concurrency In Practice](http://jcip.net/) ". 這本書里面講到了很多java里面如果做好并發編程的一些建議。但是要做到這些建議并不是一件很輕松的事情。在大多數情況下,使用java的引用類型比使用java里面并發要更簡單。 除了引用類型, Clojure還提供了其它一些函數來使你的并發編程更簡單。 `future` 宏把它的body里面的表達式在另外一個線程里面執行(這個線程來自于 `CachedThreadPool` ,Agents(后面會介紹)用的也是這個). 這個對于那種運行時間比較長, 而且一下子也不需要運行結果的程序來說比較有用。你可以通過dereferencing 從 `future` . 放回的對象來得到返回值。 如果計算已經結束了, 那么立馬返回那個值;如果計算還沒有結束,那么當前線程會block住,直到計算結束返回。因為這里使用了一個來自Agent線程池的線程, 所以我們要在一個適當的時機調用 `shutdown-agents` 關閉這些線程,然后程序才能退出。 為了演示 `future` 的用法, 我們加了一些println的方法調用,它能幫助我們觀察方法執行的狀態,注意輸出的消息的順序。 ``` (println "creating future") (def my-future (future (f-prime 2))) ; f-prime is called in another thread (println "created future") (println "result is" @my-future) (shutdown-agents) ``` 如果 `f-prime` 是一個比較耗時的方法的話, 那么輸出應該是這樣的: ``` creating future created future derivative entered result is 9.0 ``` `pmap` 函數把一個函數作用到一個集合里面的所有的元素, 和map不一樣的是這個過程是完全并行的, 所以如果你要調用的這個函數是非常耗時間的話, 那么使用pmap將比使用 `clojure.parallel` 名字空間里買你有好多方法可以幫助你并行化你的代碼, 他們包括: `par` , `pdistinct` , `pfilter-dupes` , `pfilter-nils` , `pmax` , `pmin` , `preduce` , `psort` , `psummary` 和 `pvec` .
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看