`
edwardpro
  • 浏览: 310573 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Thread In Ruby

 
阅读更多

今日终于把原来留下来的ios notify给整了,由于用户数据的增加这个库显然力不从心,过程就不说了。

这个东西原来是rails 3写的,APN发送也有现成的库用gem装下就能用了,关键在于原来的发送任务,由于rails 3中提供了一个基于redis的分布式任务系统,但这个东西自从我升级了redis后就再跑不起来,调试了几下也没有太多成果,时间来不及了,于是用了ruby下的Thread包。

 

今天想把自己使用Thread在ruby下进行多线程编程的内容分享一下:

 

1 base的使用非常简单:

 

 

Thread.new(args...){|args...|}

 

 

当然还有fork和start方法本质上差别不大,我都是用的new,start实际上是new的别名(也可能是反过来,反正记住这两个没差别就是了。

 

2 多线程的同步处理:

 

由于ruby实际上是一个脚本语言,它并没有像java一样复杂的内存管理区块(至少看起来没有,有几个点证明的,我后面会说)但是ruby提供了非常简单一些同步处理的方法。

 

首先如果你要同步等待一个Thread,可以这么写:

thread = Thread.new{}
thread.join

 join 以后,就意味着它的父thread就必须等待它执行完毕才能继续后面的代码,于是比如在循环中你可以通过这个来进行同步等待,这个比在java中还是要方便不少,当然这玩意是脚本语言不方便就不对了。

for n in [1...10] 
thread=Thread.new{}
thread.join
end

 接下来线程的顺序,这个方法是看来的:

thread1 = Thread.new{self.stop; xxxxx}
thread2 = Thread.new{self.stop; xxxxx}
thread3 = Thread.new{self.stop; xxxxx}
thread1.join
thread1.start
thread2.join
thread2.start
thread3.join
thread3.start

 上述代码还可以用来做类似java里的执行器功能即可。

 

3 关于thread特别注意的地方:

 

线程里的上下文是干净和独立的,thread里虽然是一个内部类的实现,但是它本身不能共享上面的数据,所以当你要传参的时候必须使用参数方法

 

 

Thread.new(a){xxxxx}

 这个我一开始很不习惯,突然发现父类的东西都nil了。。。后来才发现这个道理,于是我的第一个猜想就是ruby的内存管理是一种stack而且为了避免线程污染的问题,它应该没有真正意义的堆,所以你可以认为它是一种非常纯正的oo语言,不像java还是可以写出很op的代码的,在ruby里似乎的确这样会让让你崩溃,特别是线程里。

 

关闭资源需要在线程中控制:

 

比如你在线程里传入一个文件句柄,那么我们必须在线程里自己关闭,而且是子底向上的,不然就会出现文件句柄在线程执行时被关闭的问题,如:

file = File.new("xxxx","w")
begin
for n in [1...10]
Thread.new(file){file.write("test\n#{n}")}
end
ensure
file.close #这个是错误的
end
 

 

这种写法100%会导致你的日志里打出来,文件已经被关闭的错误提示。如果你想这么做那么线程必须被join,这样就没有意义了,理论上这种类似功能可以在外面再套一个thread这样就可以保证上述功能成功,因为我在一个子线程中等待就ok了。虽然这样看起来很麻烦,但是仔细想想这样的设计就是不让你产生所谓的线程不安全的问题,这个比java还是方便和“低技术”不少。

 

ok利用Thread实际上基本上就能实现rails3中的基于redis的任务系统了,这样的过程还是蛮有意思的虽然过程也很痛苦,特别是当我想看ruby时发现电脑里就2本电子书,而纸质书全部找不到了,这个真的擦啊。。。

 

好了,晚安,碎觉!

 

 

 

分享到:
评论

相关推荐

    ruby语法基础教程

    §6.9.5 For..In 51 §6.9.6 Break,Redo,Next 51 §6.9.7 Retry 53 第七章 方法 54 §7.1 运算符重定义 55 §7.2 变长参数 56 §7.3 块调用 56 §7.4 方法返回值 57 第八章 模块 59 §8.1 名字空间 59 §8.2 mixin...

    RUBY基础入门指南

    - **线程创建**:使用`Thread.new`创建新线程。 - **线程操作**:线程可以被暂停、唤醒、等待结束等。 - **线程和异常**:异常会在线程中传播。 - **线程调度**:操作系统负责线程的调度。 - **线程同步**: - **...

    Ruby程序设计(简洁清新的教程)

    ### Ruby程序设计(简洁清新的教程) #### 一、Ruby语言概述 **1.1 Ruby的历史** Ruby语言是由日本人松本行弘(Matsumoto Yukihiro)在1993年开始开发的一种脚本语言。起初,Matsumoto对脚本语言产生了浓厚的兴趣,...

    Ruby Developer's Guide

    - **线程(Thread)**:Ruby的线程模型,包括线程安全的问题和解决方法。 - **进程(Process)**:创建子进程的方式及其应用场景。 #### 8. **网络编程** - **客户端与服务器**:构建网络应用程序的基本原理。 - **...

    以下是一个非常详细的Ruby语言教程.docx

    Ruby 支持多线程编程,可以使用 `Thread` 类创建新线程: ```ruby Thread.new do # 线程执行的代码 end ``` **3.3 文件操作** Ruby 提供了丰富的文件操作功能。例如: ```ruby # 读取文件 File.open("example....

    rufus-scheduler:Ruby的调度程序(at,in,cron和每个作业)

    Ruby的作业调度程序(at,cron,in和每个作业)。 它使用线程。 注意:也许您正在寻找的? (特别是如果你使用这是上鲁弗斯调度2.0.24) 快速开始: # quickstart.rb require 'rufus-scheduler' scheduler = ...

    Ruby入门教程

    - **10.1.1 线程创建**:使用`Thread.new`创建新线程。 - **10.1.2 线程操作**:包括启动、等待结束等。 - **10.1.3 线程和异常**:如何处理线程中发生的异常。 - **10.1.4 线程调度**:控制线程的执行顺序。 - **...

    debug_inspector:MRI 2.0 debug_inspector API的Ruby包装器

    要求在不受支持的Ruby上执行此操作将导致无操作用法require 'debug_inspector'# Open debug context# Passed `dc' is only active in a blockRubyVM :: DebugInspector . open { | dc | # backtrace locations ...

    C事件驱动循环的网络IO编程框架的源码.rar

    - fully supports fork, can detect fork in various ways and automatically re-arms kernel mechanisms that do not support fork. - highly optimised select, poll, epoll, kqueue and event ports backends. -...

    rootins-problem:在根本保险中测试面试过程中的问题

    这里的"根"通常代表问题的根源,而"ins"可能是"inspection"或"in-depth"的缩写,强调深入分析以确保问题不再复发。在面试过程中,测试工程师可能会被问及如何在实际工作中处理这类问题,以展示他们的故障排查能力和...

    rack-timing:Rails 应用程序机架堆栈的此类时间戳。 哇

    at=info thread_id=70351652783840 process_id=55394 request_id=013f9cc29c1e4c483435dbc15ab260f4 measure#pre_request=0ms measure#rack_in=202ms measure#app=505ms measure#rack_out=301ms 包括: thread_id ...

    linux 进程数最大值修改方法

    max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 8 2、pid_max (/proc/sys/kernel/pid_max) 这个值表示进程ID的上限。为了兼容旧版,默认为32768(即两个字节)。 <code class=hljs ruby has-numbering ...

    Python api 库函数学习

    <li><a href="/ruby">Ruby</a></li> ''' handler = DefaultSaxHandler() parser = ParserCreate() parser.StartElementHandler = handler.start_element parser.EndElementHandler = handler.end_element ...

    The Java Virtual Machine Specification 3rd

    - JVM能够支持多种动态类型语言,如Groovy、Scala、Ruby等,这些语言可以与Java代码无缝集成。 - 通过引入新的类文件格式和字节码指令,增强了JVM对于动态类型语言的支持能力。 3. **模块系统(Module System)** ...

    sonic-pi-comp-finalists:Sonic Pi 竞赛 20142015 决赛入围者

    Sonic Pi 竞赛决赛入围者 2014/15 为了庆祝的发布,我们发起了首届 Sonic Pi 比赛。 我们正在寻找一些最好的太空主题音乐,由英国学童用 Sonic Pi v2.0 编码,我们并没有... 我使用了“in thread”,让音乐一起发声。

Global site tag (gtag.js) - Google Analytics