前言
本文主要給大家介紹了關于ruby并發并行和全局鎖的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
并發和并行
在開發時,我們經常會接觸到兩個概念: 并發和并行,幾乎所有談到并發和并行的文章都會提到一點: 并發并不等于并行.那么如何理解這句話呢?
并發: 廚師同時接收到了2個客人點了的菜單需要處理. 順序執行: 如果只有一個廚師,那么他只能一個菜單接著一個菜單的去完成. 并行執行: 如果有兩個廚師,那么就可以并行,兩個人一起做菜.將這個例子擴展到我們的web開發中, 就可以這樣理解:
并發:服務器同時收到了兩個客戶端發起的請求. 順序執行:服務器只有一個進程(線程)處理請求,完成了第一個請求才能完成第二個請求,所以第二個請求就需要等待. 并行執行:服務器有兩個進程(線程)處理請求,兩個請求都能得到響應,而不存在先后的問題.根據上述所描述的例子,我們在 ruby 中怎么去模擬出這樣的一個并發行為呢? 看下面這一段代碼:
1、順序執行:
模擬只有一個線程時的操作.
require 'benchmark'def f1 puts "sleep 3 seconds in f1/n" sleep 3enddef f2 puts "sleep 2 seconds in f2/n" sleep 2 endBenchmark.bm do |b| b.report do f1 f2 end end## ## user system total real## sleep 3 seconds in f1## sleep 2 seconds in f2## 0.000000 0.000000 0.000000 ( 5.009620)
上述代碼很簡單,用 sleep 模擬耗時的操作.順序執行時候的消耗時間.
2、并行執行
模擬多線程時的操作
# 接上述代碼Benchmark.bm do |b| b.report do threads = [] threads << Thread.new { f1 } threads << Thread.new { f2 } threads.each(&:join) end end#### user system total real## sleep 3 seconds in f1## sleep 2 seconds in f2## 0.000000 0.000000 0.000000 ( 3.005115)
我們發現多線程下耗時和f1的耗時相近,這與我們預期的一樣,采用多線程可以實現并行.
Ruby 的多線程能夠應付 IO Block,當某個線程處于 IO Block 狀態時,其它的線程還可以繼續執行,從而使整體處理時間大幅縮短.
Ruby 中的線程
上述的代碼示例中使用了 ruby 中 Thread 的線程類, Ruby可以很容易地寫Thread類的多線程程序.Ruby線程是一個輕量級的和有效的方式,以實現在你的代碼的并行.
接下來來描述一段并發時的情景
def thread_test time = Time.now threads = 3.times.map do Thread.new do sleep 3 end end puts "不用等3秒就可以看到我:#{Time.now - time}" threads.map(&:join) puts "現在需要等3秒才可以看到我:#{Time.now - time}" end test ## 不用等3秒就可以看到我:8.6e-05 ## 現在需要等3秒才可以看到我:3.003699
新聞熱點
疑難解答