国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ruby中并發并行與全局鎖詳解

2019-10-26 19:29:56
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹了關于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            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永宁县| 万盛区| 合川市| 安西县| 岳池县| 潮州市| 清河县| 惠水县| 陆丰市| 东宁县| 汶上县| 天全县| 项城市| 株洲市| 涡阳县| 巴林左旗| 天镇县| 景宁| 邵阳县| 股票| 桓台县| 息烽县| 台北县| 界首市| 新晃| 唐海县| 乐平市| 博爱县| 大城县| 右玉县| 扎赉特旗| 云霄县| 台安县| 收藏| 连州市| 漠河县| 日喀则市| 海阳市| 濮阳县| 德兴市| 余庆县|