免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3830 | 回复: 8
打印 上一主题 下一主题

关于ruby多终程的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-11 21:22 |只看该作者 |倒序浏览
  1.     pages = %w( www.rubycentral.com
  2.             www.awl.com
  3.             www.pragmaticprogrammer.com
  4.            )
  5.     for n in pages  
  6.     thread=Thread.new(n){ |n|
  7.    
  8.      while true
  9.      puts n
  10.      sleep(rand(2)/1.0)
  11.     end
  12.    
  13.     }  
  14.     thread.join  
  15.     end  
复制代码
为什么只是打印第一个网址

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
2 [报告]
发表于 2012-02-12 13:05 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2012-02-13 11:26 |只看该作者
本帖最后由 bugbugbug3 于 2012-02-13 11:28 编辑

to yakczh :
1. 你写的代码的错误是:不应该在 这个for循环里调用thread.join ,这样会导致,你的循环第一遍时便在等着新创建的线程结束。换句话说,你的for循环只走了一趟而已。也只是创建了一个线程。解法是把join拿到外面。
2. 按照ruby的编码风格,不推荐用for循环,使用each 加代码块 更有ruby的味道。

代码大体修改如下(我用的是Ruby1.9.2),关键是别再循环里用join, 可以先把线程对象收集起来,最后再用join.
  1. pages = %w( www.rubycentral.com
  2.             www.awl.com
  3.             www.pragmaticprogrammer.com
  4.           )

  5. threads = []

  6. pages.each do |page|
  7.   threads << Thread.new(page) do |url|
  8.     while true
  9.       puts url
  10.       sleep(rand(2)/1.0)
  11.     end
  12.   end
  13. end  
  14. threads.map(&:join)
复制代码
to Sevk: 应该是 yakczh 使用join方法不当导致的。

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
4 [报告]
发表于 2012-02-13 14:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2012-06-26 17:52 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2012-07-06 17:15 |只看该作者
压根不是这个原因,你去看看for 和each 的区别就知道为什么了

论坛徽章:
0
7 [报告]
发表于 2012-08-09 03:33 |只看该作者
不错的~~! 感谢您提供

论坛徽章:
0
8 [报告]
发表于 2012-08-15 11:41 |只看该作者
本帖最后由 http80 于 2012-08-15 11:43 编辑

推荐:http://www.yiibai.com/ruby/ruby_multithreading.html
传统程序中有一个执行线程,包括程序的语句或指令顺序执行,直到程序终止.
一个多线程程序中有多个执行线程。在每个线程中,语句顺序执行,但可parallel.on执行线程本身多核的CPU,例如。多个线程往往在一个单CPU的机器,不实际执行并行,但并行交错执行的线程模拟.
Ruby可以很容易地写Thread类的多线程程序。 Ruby线程是一个轻量级的和有效的方式,以实现在你的代码的并行.

创建Ruby线程:
要开始一个新的线程,只是关联与以Thread.new调用块。将创建一个新线程执行的代码块,并从Thread.new原来的线程将立即返回,并恢复执行的下一条语句:

# Thread #1 is running here
Thread.new {
  # Thread #2 runs this code
}
# Thread #1 runs this code

论坛徽章:
0
9 [报告]
发表于 2012-10-12 22:17 |只看该作者
支持你加分
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP