为什么80%的码农都做不了架构师?>>>   

本来做了一个并发抓取,以为Ruby1.9以后添加的Fiber是类似于golang那种,可以实现并发运行,可是发现效率没有提高,为了确认Fiber是不是在并发执行,于是我做了一个这样的测试代码。

首先搞一个php文件:

<?php
$i = intval(isset($_GET['i']) ? $_GET['i'] : (!empty($argv[1]) ? $argv[1] : 0));if($i>0){sleep(5-$i);
}
echo $i, "\n";

然后用命令行测试,确认这个php文件是不会block的(因为没有session锁,应该不会block)

time for i in {1..5}; do (curl localhost/test.php?i=$i) & if [ "$i" -eq "5" ]; then wait; fi ; done
time for i in {1..5}; do (php test.php $i) & if [ "$i" -eq "5" ]; then wait; fi ; done

这里两种方式运行时间都是4秒左右,证明,是可以并行运行。  real    0m4.019s
然后用fiber执行: real    0m10.086s  10秒左右,证明这完全是一个一个在跑的。

#!/usr/bin/env rubyrequire 'open-uri';
fib = Fiber.new do(1..5).each do |i|Fiber.yield open("http://localhost/test.php?i=#{i}").readend
endFiber.new do5.times doputs fib.resumeend
end.resume

结果测试发现根本不能实现并发,而且是一个一个在跑,跑完一个跑下一个,所以别在被误解了Fiber根本不能并发执行,而且还有一个更奇葩的,如果是5个Fiber.yield,在resume的时候却可以调用6次resume,这个设计真不怎么样。

后来我在 stackoverflow上找到这个 http://stackoverflow.com/questions/3066392/can-ruby-fibers-be-concurrent 
看第二个回答,大概是说,Fiber只是一种 control-flow 结构,并不是用来搞并发的,他们不能并发运行,只能算是一种 Coroutine ,和并行执行不是一种东西,在ruby里,唯一能实现并发的是 Thread,那么我就奇怪为何网上有那么多人宣称可以用 Fiber 来实现并发运行?并发和协程可是不一样的。

不过也可以这样来说,Fiber是可以实现 concurrency,这个 concurrency 并不是 Parallelism,就是说,可以实现所谓的并发,但是内部却是一个一个运行的,而且并不会因为IO阻塞的时候自动调度,你需要手动调度,实际性能没有任何提升,用了只会增加代码逻辑复杂度,丝毫不能带来任何益处,同样是concurrency,golang、nodejs都可以在IO阻塞时候自动调度,所以能实现正真意义上的并发编程,但Fiber,只不过是把任务一个一个压栈,然后在一个一个等待着他们运行完毕,完全不能自由调度,真没见到有什么实质用处。

比如 这里 http://www.infoq.com/cn/news/2007/09/ruby-1-9-fibers   
标题就是 :Ruby 1.9加入纤程实现轻量级并发 ,直接就是在误导新手啊.

转载于:https://my.oschina.net/jsk/blog/465540

Ruby的Fiber根本不是用来做并发的~相关推荐

  1. Fiber 为什么做并发IO的时候更加高效

    2019独角兽企业重金招聘Python工程师标准>>> Java 要在新的JDK版本中将支持协程,java loom project ,这个project的发起人正是Quasar的作 ...

  2. [译] Fiber内幕:深入概述React新的协调算法

    原文地址:medium.com/react-in-de- 如何以及为何从React组件到Fiber节点的一切内容 React使用一个构建用户界面的JavaScript库,它的核心机制是跟踪组件状态的的 ...

  3. DHH观点:为什么我偏爱Ruby?

    DHH观点:为什么我偏爱Ruby? David Heinemeier Hansson(DHH)在RailsConf 2006的Keynote Address中讨论Rails具有各种convention ...

  4. 六个问题让你更懂 React Fiber

    作者 | 零一0101 来源 | 前端印象 React Fiber 是Facebook花费两年余时间对 React 做出的一个重大改变与优化,是对 React 核心算法的一次重新实现.从Faceboo ...

  5. 为什么Ruby方法中使用感叹号?

    在Ruby中,一些方法有一个问号( ? ),问一个像include?这样的问题include? 询问是否包含有问题的对象,然后返回true / false. 但为什么有些方法会有感叹号( ! )而其他 ...

  6. [转载] Ruby、Rails、Agile的启示

    转自:http://vipnews.csdn.net/newscontent.aspx?pointid=2008_03_03_170600555 文/杨祥吉 本文作者以使用Ruby和Rails进行创业 ...

  7. 手写简易版 React 来彻底搞懂 fiber 架构

    React 16 之前和之后最大的区别就是 16 引入了 fiber,又基于 fiber 实现了 hooks.整天都提 fiber,那 fiber 到底是啥?它和 vdom 是什么关系? 与其看各种解 ...

  8. ruby语言是什么东西?

    作者:http://www.ruby-cn.org/ 转载请保留 1.简介     Ruby是日本的Yukihiro Matsumoto写的,简单易学的面向对象的脚本语言,像perl一样,有丰富的文字 ...

  9. Ruby on rails 实战圣经:Part 1: 入门导览-Ruby on Rails 简介

    Ruby on Rails 简介 "Life's too short tobuild something nobody wants" - Ash Maurya, Running L ...

最新文章

  1. poj 2355(简单dp)
  2. postmessage与sendmessage的区别
  3. Objective-C策略模式(Strategy)
  4. jzoj4743-积木【状压dp】
  5. Boost高性能网络编程
  6. 【刷题】BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
  7. STM32最小系统使用FlyMcu烧写步骤
  8. UE4 虚幻引擎,BluePrint蓝图接受输入
  9. php度分秒,度分秒计算方法-度分秒的计算方法!急
  10. IDEA离线安装插件
  11. 计算机显示器分辨率,电脑分辨率多少合适,详细教您电脑显示器分辨率怎么调整...
  12. python tokenize()_tokenize- 用于Python源代码的Python – Python语言服务(Python教程)(参考资料)...
  13. SQL考试练习题及全部答案3
  14. PAT_乙级_1006_筱筱
  15. 【微信小程序系列:一】携带参数跳转半屏微信小程序 先 A->B 后 B ->A
  16. Ubuntu19.04网易云音乐字体大小调整
  17. Project build error: Non-parseable POM D:\code\pom.xml: expected start tag name and not
  18. iOS APP设计规范大全
  19. Neo4j入门级学习笔记
  20. php v9 分页静态,phpcms v9 为分类和内容添加伪静态

热门文章

  1. unit 12 文档练习
  2. Nginx 的 Echo 模块 —— echo-nginx-module(转)
  3. 获取DataGridView上选中的一行并转换为一个DataRow类型
  4. 计划任务中使用NT AUTHORITY\SYSTEM用户和普通管理员用户有什么差别
  5. 我与布拉德利(Todd Bradley)聊天
  6. Q73:蒙特•卡罗积分(Monte Carlo Integration)
  7. 6.2(求一个整数各位数字之和)
  8. 如何针对大数据进行分析
  9. Window平台下通过cmd命令查看端口占用、查看进程、结束进程
  10. 关于C++的建议,仅仅为了规范代码(二)