`
DAOException
  • 浏览: 122228 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Ruby线程学习(一)

    博客分类:
  • ruby
阅读更多

      我们都知道,一个程序可能有多个进程组成,而一个进程也可以有多个线程并行运行。线程的并行运行,可以提高程序的运行效率,但也存在着很多的危险,可能出现多个线程抢占一个资源的情况。这里我们就以ruby为例来说一说线程在ruby当中的应用。

      我们先从一个简单的程序开始,程序实现一个并行对不同网站发送请求的过程。代码如下所示:

require 'net/http'

pages = %w(www.iteye.com www.csdn.net www.sina.com.cn www.google.cn)
threads = []

for page in pages
  threads << Thread.new(page) do |url|
    h = Net::HTTP.new(url, 80)
    puts "The URL is #{url} "
    resp = h.get('/', nil)
    puts "The #{url} response : #{resp.message}"
  end
end

threads.each { |t|t.join  }

      该段程序引用自Programming Ruby当中,程序中提供了一个网站列表数组,然后并发的从数组当中请求相应的网站。可能有些人对%w有些迷惑,%w会自动的对括号后面的字符串以空格进行分割,保存在数组当中。怎么样,ruby很sex吧,省去了很多的“”的困扰了。

      我们通过Thread.new来创建线程。我们将网站列表当中的地址作为参数传递给线程。这里有个问题就是我们为什么不把地址直接传递给block(net)呢。这里就牵扯到了线程的全局变量和局部变量的概念了。试想一下,如果我们把地址直接传递给net模块,那么如果在线程1没有执行完成的时候,线程2启动了,重新给page赋值,此时的线程1还在使用page。错误这个时候就会产生了,往往这种错误在线程并行当中很难发现。我们所做的就是将变量私有化给线程。这里我们将每个传递给线程的变量私有化未url,只在当前线程当中有效。这样就很好的解决了线程之间的一个全局变量共享的问题。

threads.each { |t|t.join  }

      大家可能注意到这段代码了,在ruby当中,当程序终止的时候,不管线程状态如何,所有的线程都会被杀死。我们调用Thread#join方法用来等待特定的线程结束。调用join的线程会阻塞,直到指定线程结束,所以对所有线程执行join操作,可以保证在程序结束前执行完所有的线程。


      上面提到了,线程可以有其私有变量,线程的私有变量在线程创建的时候写入线程。可以被线程范围内使用,但是不能被线程外部进行共享。但是有时候,线程的局部变量需要别别的线程或者主线程访问怎么办?ruby当中提供了允许通过名字来创建线程变量,类似的把线程看做hash式的散列表。通过[]=写入并通过[]读出数据。我们来看一下下面的代码:

# 线程变量

count = 0
threads =[]
10.times do |i|
  threads[i] = Thread.new  do
    sleep(rand(0.1))
    Thread.current["myvalue"] =count  #将值赋给当前变量
    count += 1
  end
end

threads.each { |t| t.join; puts t["myvalue"] }
  我们和前面的程序一样,分别创建10个线程,并将值赋值给当前线程,用myvalue进行标识,最后我们在线程外部可以通过myvalue标示对数据进行读取。 好吧,线程的第一步就说到这里把。明天继续
分享到:
评论

相关推荐

    Working with Ruby Threads

    ### Ruby线程开发技术详解 #### 引言 在计算机科学领域中,多线程编程是一种常见的技术,它允许多个任务同时运行在一个程序中。《Working with Ruby Threads》这本书深入探讨了Ruby语言中的线程机制,对于希望利用...

    ruby学习资料大全,很全很丰富

    Ruby是"一种用于迅速和简便的面向对象编程的解释性脚本语言";这意味着什么? 解释性脚本语言: 有直接呼叫系统调用的能力 强大的字符串操作和正则表达式 开发中快速回馈 迅速和简便: 无需变量声明 变量无...

    Working with Ruby Threads(完整版)

    通过阅读"Working With Ruby Threads"这本书,你可以深入了解Ruby线程的内部工作原理,学习如何编写高效、安全的多线程Ruby程序。这本书不仅涵盖了理论知识,还提供了许多实用示例和最佳实践,对任何希望提升Ruby...

    Ruby学习资料chm

    这份"Ruby学习资料chm"集合了关于Ruby的基础学习材料,对于初学者或是希望深入理解Ruby的人来说是一份宝贵的资源。 Ruby的核心特性包括: 1. 面向对象:在Ruby中,一切都是对象,包括基本的数据类型如整数、字符串...

    Ruby-Puma一个Ruby的并发Web服务器

    Ruby-Puma是一个高性能、轻量级且并发的Web服务器,专为Ruby编程语言设计。它在Ruby社区中广泛用于构建Web应用程序,特别是与Rails框架一起使用。Puma的设计目标是提供稳定、快速和易于管理的服务,同时保持低内存...

    Ruby-RubyJMeter一个基于Ruby的DSL用于构建JMeter测试计划

    Ruby-JMeter是一个强大的工具,它将Ruby编程语言与Apache JMeter测试框架相结合,为性能测试和负载测试提供了灵活且易于使用的领域特定语言(DSL)。这个工具使得测试人员和开发者能够用Ruby编写JMeter测试计划,...

    Ruby资源ruby-v3.1.1.zip

    4. **线程局部变量**:Ruby 3.1增加了对线程局部变量的支持,这些变量在每个线程中都有独立的副本,提高了多线程编程的安全性和效率。 5. **改进的错误消息**:错误消息现在更加详细,包含更多信息,帮助开发者更快...

    Ruby教程.chm和Ruby程序设计.doc

    这可能是一份详细的指导文档,涵盖了更高级的主题,如文件操作、网络编程、数据库交互、线程和并发、Gem(Ruby的库管理器)的使用、测试驱动开发(TDD)以及Rails框架的基础知识。Rails是Ruby最著名的Web应用框架,...

    ruby 经典教程从新手到专家

    《Ruby经典教程:从新手到专家》是一本深入浅出介绍Ruby编程语言的权威指南,由Peter Cooper编写,why the lucky stiff作序推荐,专为Ruby爱好者和希望掌握Ruby编程技术的学习者设计。本书全面覆盖了Ruby编程的基础...

    Ruby经典学习教程(口碑不错)

    ### Ruby经典学习教程知识点梳理 #### 一、Ruby语言概述 **1.1 Ruby的历史** - **起源**:Ruby语言最初由日本人松本行弘(Yukihiro Matsumoto)于1995年开始开发。 - **设计理念**:旨在提供一种既能满足功能需求...

    ruby入门到精通

    虽然书名没有直接提及Rails,但作为Ruby学习的一部分,理解其MVC架构、ActiveRecord、路由和生成器等概念会非常有帮助。 12. **测试驱动开发(TDD)和持续集成**:Ruby社区重视测试,因此学习如何使用Rspec等测试...

    ruby-2.6.3源码压缩包

    同时,通过阅读源码,开发者可以深入理解Ruby的内部机制,学习如何实现一个动态语言的编译器和运行时系统。这对于想要参与Ruby核心开发或者希望提升编程技能的人来说,是一份宝贵的资源。 为了编译和运行Ruby源码,...

    Ruby编程,Ruby编程,

    Ruby是一种动态的、面向对象的、通用型的编程语言,自1995年由日本程序员松本行弘(Yukihiro Matsumoto)创建以来,便以其简洁优雅的语法、高度可读性和易于学习的特点而受到全球开发者的喜爱。它在设计时融合了Perl...

    Ruby 编程语言的书籍

    1. **Ruby内部机制揭秘**:每章末尾都包含“Digging Deeper”部分,揭示Ruby运行时的各种细节,如作用域解析、多线程实现等,帮助读者更好地理解语言本身的设计理念。 2. **陷阱与注意事项**:通过实际案例分析常见...

    Ruby语言入门教程v1.0

    《Ruby语言入门教程v1.0》是一份详尽的指南,旨在为初学者提供一个易于理解的Ruby语言学习路径。下面,我们将深入探讨该教程所涵盖的关键知识点,特别是其标题和描述中提及的核心概念。 ### 1. 编程语言的发展简史 ...

    ruby-2.5.8.tar.gz

    - pry:一个增强的交互式Ruby shell,便于调试和学习。 通过理解这些知识点,你将能够更好地理解和使用Ruby-2.5.8这一版本,无论是进行开发、学习还是解决问题。记得定期更新到最新版本以获取最新的安全补丁和功能...

    ruby语言帮助文档(简体中文)

    Ruby语言的帮助文档是学习和理解其语法、类库、方法和框架的重要资源。 这个"ruby语言帮助文档(简体中文)"包含了Ruby的所有基础知识,从语言特性到高级概念,为初学者和经验丰富的开发者提供了全面的指导。以下是...

    ruby 1.9.3 p484稳定版本

    同时,熟悉Ruby的异常处理机制、垃圾回收机制以及线程模型也是十分必要的,这些都影响着程序的性能和健壮性。 总的来说,Ruby 1.9.3 p484是Windows平台上一个稳定的Ruby版本,它的优化和增强使其成为开发者的可靠...

Global site tag (gtag.js) - Google Analytics