今日终于把原来留下来的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 Thread 开发技术,深度解析
http://groups.google.com/group/watir-general/browse_thread/thread/cd2ce989784fa854 Hi every1, I am new to Watir and Firewatir. I tried the Watir in 5 mins tutorial on Watir OpenQA Wiki. It ran ...
Concurrent Ruby - 现代并发工具。包括agents, futures, promises, thread pools, supervisors。
Exception in thread “main“ java.util.InputMismatchException
thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread ...
本文从JVM的角度探讨Java Thread的语法和编译结果,本文旨在介绍这些比较重要的线程相关的规范。
Thread Synchronization in User Mode, OS programming.
Working With Ruby Threads(完整版),非常帮的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...
出现Exception in threadmain java.lang.NoClassDefFoundError的各种可能情况.doc
Ruby的作业调度程序(at,cron,in和每个作业)。 它使用线程。 注意:也许您正在寻找的? (特别是如果你使用这是上鲁弗斯调度2.0.24) 快速开始: # quickstart.rb require 'rufus-scheduler' scheduler = ...
Can't locate ThreadQueue.pm
STM32可以有STM32CubeMX轻松移植THreadX,雅特力从AT43F435/437系列开始不能完全兼容STM32,用不了THreadX了。 本移植采用最新(截至2023年3月12号)的AT32F435/437固件库V2.1.2,THreadX版本V6.2.1;依照雅特力官方...
线程创建,线程等待与清除,thread_clean.c,thread_create.c,thread_create.c,thread_exit_struct.c,thread_id.c,thread_int.c, thread_join.c, thread_join.c, thread_string.c, thread_struct.c
Concurrent Programming in Java Thread 看看吧
本文件夹专为以下错误对症下药。...Exception in thread "VFW Request Thread" java.lang.UnsatisfiedLinkError: JMFSecurityManager: java.lang.UnsatisfiedLinkError: no jmvfw in java.library.path
是第一次在C#中接触Thread,自己研究了一下其中Thread.Join()这个方法,下面谈谈自己的理解。 Thread.Join()在MSDN中的解释很模糊:Blocks the calling thread until a thread terminates 有两个主要问题: ...
本手册提供了有关ThreadX——Express Logic 公司高性能实时内核的详尽信息。 指南之意义 本手册适用于嵌入式实时软件的开发者。开发者应熟悉标准实时操作系统的功能及C 程序设计。 结构 手册包括七章,五个附录以及...