今日终于把原来留下来的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本电子书,而纸质书全部找不到了,这个真的擦啊。。。
好了,晚安,碎觉!
分享到:
相关推荐
本书《Making Use of Ruby》由Suresh Mahadevan撰写,并由Wiley Publishing, Inc.出版,旨在为读者提供全面深入的Ruby语言学习资源。本书不仅适合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...
- **线程创建**:使用`Thread.new`创建新线程。 - **线程操作**:线程可以被暂停、唤醒、等待结束等。 - **线程和异常**:异常会在线程中传播。 - **线程调度**:操作系统负责线程的调度。 - **线程同步**: - **...
### Ruby程序设计(简洁清新的教程) #### 一、Ruby语言概述 **1.1 Ruby的历史** Ruby语言是由日本人松本行弘(Matsumoto Yukihiro)在1993年开始开发的一种脚本语言。起初,Matsumoto对脚本语言产生了浓厚的兴趣,...
- **线程(Thread)**:Ruby的线程模型,包括线程安全的问题和解决方法。 - **进程(Process)**:创建子进程的方式及其应用场景。 #### 8. **网络编程** - **客户端与服务器**:构建网络应用程序的基本原理。 - **...
Ruby 支持多线程编程,可以使用 `Thread` 类创建新线程: ```ruby Thread.new do # 线程执行的代码 end ``` **3.3 文件操作** Ruby 提供了丰富的文件操作功能。例如: ```ruby # 读取文件 File.open("example....
Ruby的作业调度程序(at,cron,in和每个作业)。 它使用线程。 注意:也许您正在寻找的? (特别是如果你使用这是上鲁弗斯调度2.0.24) 快速开始: # quickstart.rb require 'rufus-scheduler' scheduler = ...
- **10.1.1 线程创建**:使用`Thread.new`创建新线程。 - **10.1.2 线程操作**:包括启动、等待结束等。 - **10.1.3 线程和异常**:如何处理线程中发生的异常。 - **10.1.4 线程调度**:控制线程的执行顺序。 - **...
Thread平台的AIOT智能语音管家设计源码,包含2891个文件,包括1077个头文件、1025个C源文件、189个HTML文件、125个S文件、41个文本文件、29个Python脚本、18个Markdown文件、14个PNG图像文件、9个Shell脚本、8个IN...
要求在不受支持的Ruby上执行此操作将导致无操作用法require 'debug_inspector'# Open debug context# Passed `dc' is only active in a blockRubyVM :: DebugInspector . open { | dc | # backtrace locations ...
- 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. -...
这里的"根"通常代表问题的根源,而"ins"可能是"inspection"或"in-depth"的缩写,强调深入分析以确保问题不再复发。在面试过程中,测试工程师可能会被问及如何在实际工作中处理这类问题,以展示他们的故障排查能力和...
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 ...
max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 8 2、pid_max (/proc/sys/kernel/pid_max) 这个值表示进程ID的上限。为了兼容旧版,默认为32768(即两个字节)。 <code class=hljs ruby has-numbering ...
<li><a href="/ruby">Ruby</a></li> ''' handler = DefaultSaxHandler() parser = ParserCreate() parser.StartElementHandler = handler.start_element parser.EndElementHandler = handler.end_element ...
- JVM能够支持多种动态类型语言,如Groovy、Scala、Ruby等,这些语言可以与Java代码无缝集成。 - 通过引入新的类文件格式和字节码指令,增强了JVM对于动态类型语言的支持能力。 3. **模块系统(Module System)** ...