我们都知道,一个程序可能有多个进程组成,而一个进程也可以有多个线程并行运行。线程的并行运行,可以提高程序的运行效率,但也存在着很多的危险,可能出现多个线程抢占一个资源的情况。这里我们就以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标示对数据进行读取。
好吧,线程的第一步就说到这里把。明天继续
分享到:
相关推荐
Ruby是"一种用于迅速和简便的面向对象编程的解释性脚本语言";这意味着什么? 解释性脚本语言: 有直接呼叫系统调用的能力 强大的字符串操作和正则表达式 开发中快速回馈 迅速和简便: 无需变量声明 变量无...
学习 Ruby Thread 开发技术,深度解析
随着对Ruby语言的深入理解,可以进一步探索Ruby的高级特性,如反射、协程、线程安全等,并结合实际项目巩固知识。同时关注社区的最佳实践和最新版本的语言更新。
主要介绍了Ruby多线程编程初步入门,线程是Ruby编程学习当中的重点和难点,需要的朋友可以参考下
主要介绍了初步讲解Ruby编程中的多线程,线程是各种编程语言学习当中的重点和难点,需要的朋友可以参考下
Ruby之书 这是《Ruby 之书》一书... Ruby 以易于学习而闻名,但大多数用户只触及了它可以做的事情的皮毛。 其他书籍侧重于 Ruby 的时尚特性,而 The Book of Ruby揭示了世界上最流行的编程语言之一的秘密内部工作原理,
本文主要给大家介绍了关于ruby并发并行和全局锁的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 并发和并行 在开发时,我们经常会接触到两个概念: 并发和并行,几乎所有谈到并发和...
EventCore-Ruby的通用主循环Travis CI状态: 提供完全异步应用程序的核心。 出于简单性和鲁棒性而建模,对于超高负载或实时环境则没有那么多。 除了保留,EventCore仍应轻松为大多数应用程序提供足够低的延迟和足够...
下一步最常见的方法之一就是研究解决方案,但这听起来常常像是用大炮杀死一只蚂蚁,而且这并非没有小的(但存在的)学习曲线。 还有其他十二个含义。 就个人而言,我发现同步IO是常见CLI的最讨厌的限制。 如果在...
jServe 是一个用 Java 构建的多线程 Web 服务器,它帮助我在我喜欢编写的真实应用程序中学习 Java 概念和一般编程。 我知道 Web 服务器并不是什么新鲜事物,已经有很多很棒的服务器了,但这就是我想编写 jServe 的...
首先,我用 Ruby 制作了一个扑克 AI ......不够快! 然后我用 Python 做了另一个……还是太慢了! 所以这是我使用 2+2 手评估器算法完全用 C 编写的第三个扑克 AI。 HANDRANKS.DAT 文件需要从给定的 XPokerEval....
让我们将其作为Ruby最强大的资源 :purple_heart:命令行工具配置CSS和样式资料验证数据可视化数据库驱动程序日期和时间调试工具DevOps工具分配文献资料下载器电子商务和在线支付电子邮件环境管理学文件上传功能翻转...
XWEB框架是一款基于Python语言的Web开发框架 ##Why Python? 我曾经使用过Java、PHP、Ruby和Python来开发Web应用,至于为什么使用Python作为XWEB的语言,其实最主要的原因: 1. Ruby不再需要新的WEB开发框架,...
我想要一个学习项目,所以我决定: 删除来自所有链接 将其在线发布,以便您可以访问随机博客或随机博客文章。 到目前为止,我已经完成了一个网络抓取工具,该抓取工具将上述博客文章的顶级评论links.txt并保存到...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
1.MySQL的下载安装与使用,官网下载链接 ...既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入其他的软件中。 提供多语言支持,常见的编码如中文的 GB 2312、BIG 5,日文的
1.3 由perl和ruby语言实现的web服务客户端 10 1.4 了解soap 11 1.5 java语言实现web服务请求 13 1.6 基于通信层的http和soap消息跟踪 14 1.7 目前为止还有什么不清楚 16 1.8 java soap编程api 18 1.9 带有复杂数据...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
这是我们的问题,但主要目标是学习如何在 ruby 中使用线程,因此,我们需要设计一个解决方案,以两种方式在很长的文本中查找单词数 顺序的 线程 请为您的解决方案使用文件“text.txt”,将其复制到您的解决方案...
\10.1 启动一个线程 261 \10.2 线程互斥与同步 264 \10.2.1 临界区问题 265 \10.2.2 使用QMutex 265 \10.2.3 使用QSemaphore 266 \10.2.4 使用QWaitConditon 269 \10.3 线程的其他问题 271 \10.3.1 优先级...