Ruby线程学习(一)

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

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

require 'net/http'

pages = %w(www.iteye.com www.youkuaiyun.com 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标示对数据进行读取。 好吧,线程的第一步就说到这里把。明天继续
解决Android UVCCamera stopPreview 报错 崩溃 闪退 问题 在使用libuvccamera库的UVCCamera时,经常在调用stopPreview关闭预览的时候,app直接崩溃闪退了,经过综合各种修改源码的方案,已解决这个问题,以下请参考: 首先找到android_usbfs.c,linux_usbfs.c两个原文件,在两个文件中都可以找到这段代码,按如下示例修改: 修改前: for (i = 0; i < num_urbs; i++) { if (urb == tpriv->iso_urbs[i]) { urb_idx = i + 1; 阅读详情

相关推荐

如何用YOLOv5改进无人机小目标检测?MFFSODNet实战教程(附代码)

本文详细介绍了如何利用YOLOv5框架结合MFFSODNet网络结构优化无人机航拍图像中的小目标检测。通过引入微小目标预测头、多尺度特征提取模块(MSFEM)和双向密集特征金字塔网络(BDFPN)等核心技术,显著提升了小目标检测精度。文章提供了完整的代码实现方案,并展示了在农业监测、电力巡检等实际场景中的应用效果。

sre5engineer的博客 738

Ruby多线程

Ruby多线程 Ruby多线程教程,编程教程,例子教程,参考手册和代码 - 传统程序有一个执行线程,包括程序的语句或指令顺序执行,直到程序终止. 传统程序中有一个执行线程,包括程序的语句或指令顺序执行,直到程序终止. 一个多线程程序中有多个执行线程。在每个线程中,语句顺序执行,但可parallel.on执行线程本身多核的CPU,例如。多个线程往往在一个单CPU的机器...

weixin_30846599的博客 236

HTML入门(详细教程),前端入门从这里开始

HTML基础教程,网页框架搭建,表单制作,了解HTML标签的基本用法,每个标签具备哪些属性。

wandertp的博客 1283

ruby 线程id_Ruby中的线程

ruby 线程id Ruby线程 (Ruby Threads) In Ruby, with the help of threads, you can implement more than one process at the same time or it can be said that Thread supports concurrent programming model. Apart f...

cumtb2002的博客 411

Windows/Mac/Linux三系统保姆级教程:用llama.cpp将safetensors模型转gguf格式(附常见错误解决)

本文提供Windows、Mac和Linux系统下使用llama.cpp将safetensors模型转换为gguf格式的详细教程,涵盖环境配置、转换原理及常见错误解决方案。通过跨平台兼容性处理,帮助开发者高效完成模型格式转换,优化边缘计算性能。

weixin_29227425的博客 270

搭建适用于lammps中opls-aa力场的文件流程

现在我已经解决了以上问题,并且通过我的方法可以实现从空白文档到搭建完成以上全部内容,后期只要细心检查即可。需要的data文件最关键是获得相应阴阳离子的mmol文件,因此问题转化为构建一份mmol文件。主要用到的软件及程序:gaussian09,makemol程序(tranal),opls-aa的参数文件。二面角个数:成角原子序号及对应的参数(这里PF6的结构没有二面角,所以为0)参考文献个数:文献名(空够行数即可,这些是给自己的备忘))和自身体系对应的参考文献,修改或填入对应的参数即可。

baguette的博客 2886

Ruby学习之多线程的使用方式

每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程。Ruby 中我们可以通过 Thread 类来创建多线程,Ruby的线程是一个轻量级的,可以以高效的方式来实现并行的代码,来看下启动一个新的线程的代码格式: # 线程 #1 代码部分 Thread.new { # 线程 #2 执行代码 }...

luyaran的博客 2793

[QDS]从零开始,写第一个Qt Design Studio到程序调用的项目

最近在使用Qt Design Studio进行开发,但是简中网上要不就是只搜得到Qt Designer(Qt Creator内部库),要不就只搜得到一点营销号不知道从哪里搬来的账号,鉴于Qt Design Studio是一个这么强大的软件,自然是需要来进行一下小小的实践的。所以开了这篇文章,方便没有使用过Qt Design Studio 和 QML的开发者也可以快速上手QDS(Qt Design Studio)。在本文中,你将学会如何使用QDS开发一个简单的QML程序,与你的C++后端代码进行交流。

Andius的博客 8212

ruby的线程和进程

ruby的线程和进程 Ruby给了你两个基本的方法来组织你的程序,使它同时能运行自己的不同部分。你可以使用多线程在程序内部将任务分割,或者将任务分解为不同的程序,使用多进程来运行。下面我们轮流看一下这两种方法。 多线程 一般来说同时做两件事情最简单途径是使用Ruby线程。线程在进程中,由Ruby解释器实现。这使得Ruby线程很轻便--它不需要依赖特定的操作系统,

chdqiancheng的专栏 742

使用R语言中的NbClust包确定最佳聚类簇数

聚类分析是一种常用的数据分析技术,它将相似的数据点分组成不同的簇。NbClust包是R语言中一个强大的工具,它提供了多种方法来帮助我们确定最佳的聚类簇数。综上所述,使用R语言中的NbClust包可以帮助我们确定最佳的聚类簇数。通过选择适当的聚类算法和评估指标,我们可以更好地理解数据集的结构和模式,并根据需要进行进一步的分析和解释。此外,NbClust包还提供了其他函数和参数,用于执行不同的聚类算法、选择不同的评估指标等。安装完毕后,我们需要加载NbClust包,以便使用其中的函数。函数来确定最佳聚类簇数。

2301_79326559的博客 2279

【ChangeCLIP】Remote sensing change detection with multimodal vision-language representation learning

ChangeCLIP论文及代码使用详解。持续更新变化检测最新论文,欢迎订阅本专栏。

向上生长的程序媛的博客 1335

Goby语言完整指南:如何快速掌握这个Go与Ruby的完美融合

Goby是一个面向对象解释型编程语言,它深度借鉴了Ruby的语法简洁性,同时100%基于Go语言实现。这种独特的融合让Goby成为学习编程的绝佳选择,特别适合想要了解现代编程语言设计的初学者和开发者。🎯 ## 为什么选择Goby编程语言? Goby语言的设计理念是将Go语言的并发性能与Ruby的优雅语法完美结合。通过直观的语法和强大的并发支持,Goby让编程变得更加简单高效。 [![Gob

gitblog_00070的博客 549

漫画安全HIDS、EDR、NDR、XDR

漫画安全HIDS、EDR、NDR、XDR

墨痕诉清风的博客 3445

The blogs' titles which I will write recently

Because I'm reading the Chinese version of &lt;programmping ruby=""&gt; and I want to read it as quickly as possible,I didn't write any blog about ruby when I was reading some knowledge about Ruby.I i...

reverocean 101

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Ruby语言的多线程编程

线程是程序中执行的最小单元,它是在进程中运行的一条执行路径。每个线程都有自己的栈空间和局部变量,但它们共享同一进程的内存空间。多个线程可以并发执行,从而实现更高效的资源利用。

2501_90407275的博客 1522

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ruby多线程_Ruby中的多线程

ruby多线程 Ruby多线程 (Ruby Multithreading) If we talk about a normal program in Ruby, all statements are executed sequentially because it used to have a single thread commonly known as the main thread. But...

cumubi7552的博客 556

ruby线程控制,线程同步

在Ruby中线程是用户级线程并依赖与操作系统。线程是进程中的一个实体,是被系统独立调度和分配的基本单位。线程可以与同属于同样个进程的其他线程共同共享进程的全部资源。但是线程不拥有资源,只需要一点在运行时必不可少的资源。 线程的基本控制,如果主进程结束,会结束所有的线程。所以如果你的线程在执行显示的任务,但是主进程却已经执行完毕,会看不到线程的任何输出。如链接中所示: http://bl

Work Hard, Play Harder! 5153
上一篇: axis学习小记(一)
下一篇: Intype 下载
refactaar
博客等级 码龄17年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值