Ruby 线程
Ruby Thread
Thread 表示轻量级的子进程。这是一个单独的执行路径。在 Ruby 中,程序的不同部分可以通过使用多线程在程序内拆分任务或使用多进程在不同程序之间拆分任务来同时运行。
线程是并发编程的 Ruby 实现模型。
Ruby 多线程
普通程序只有单线程执行。程序中的所有语句都是按顺序执行的。
一个多线程程序中有多个执行线程。它使用更少的内存空间并共享相同的地址空间。多线程用于一次执行多个任务。
使用 thread.new 调用创建一个新线程。它不同于主线程的执行。
线程初始化
创建新线程Ruby提供了三个关键字,分别是::new、::start和: :fork。
要启动一个新线程,请将代码块与对Thread.new、Thread.start 或Thread.fork 的调用相关联。线程将被创建。块退出时新线程退出。
语法:
# Original thread runs Thread.new {
# new thread is created. } # Original thread runs
线程终止
在 Ruby 中有多种终止线程的方法。要退出给定线程,请使用 ::kill 类。
语法:
thr = Thread.new { ... } Thread.
kill(thr)
Ruby 线程示例
#!/usr/bin/ruby th = Thread.new
do
#Here we start a new thread Thread.current[
'counter']=0 5.times
do
|i|
#loop starts and increases i each time Thread.current['counter']=i sleep 1 end
return nil end
while th['counter'].to_i < 4
do =begin th is the
long running thread and we can access the same variable from inside the thread here =end puts
"Counter is #{th['counter']}" sleep 0.5 end puts
"long running process finished!"
输出:
线程生命周期
线程一旦创建,就无需启动。当它获得适当的 CPU 资源时,它会自动运行。块中的最后一个表达式是线程的值。如果线程完全运行,则 value 方法返回线程值,否则 value 方法阻止它并在线程完成时返回。在运行查询和操作线程时,线程类定义了许多方法。
通过调用线程的 Thread.join 方法,您可以等待特定线程完成。
线程异常处理
线程中可能有一些异常。如果在主线程以外的任何线程中出现异常,则取决于 abort_on_exception。默认情况下,此选项始终为 false。这意味着未处理的异常将默默地终止线程。这可以通过将 abort_on_exception = true 或 $DEBUG 设置为 true 来更改。
要处理异常,您可以使用类方法 ::handle_interrupt。它将与线程异步处理异常。
线程变量和作用域
线程是用块创建的。在块内创建的局部变量只能被该块所在的线程访问。
Ruby 线程类允许通过名称创建和访问线程局部变量。线程对象被视为散列,使用 []= 写入元素并使用 [] 读取它们。
线程调度
Ruby 支持通过使用 ::stop 和 ::pass 方法来调度线程
::stop 类方法将当前运行的线程置于睡眠状态并调度另一个线程的执行。一旦线程休眠,实例方法wakeup 用于将线程标记为适合调度。
::pass 类方法尝试将执行传递给另一个线程。正在运行的线程是否会切换取决于操作系统。
线程优先级给出了根据线程的优先级调度线程的提示。首先调度高优先级线程。它还取决于操作系统。线程可以在它采取的第一个操作时增加或减少它自己的优先级。
线程排除
Ruby 线程排除规定,当两个线程共享相同的数据并且其中一个线程修改该数据时,我们需要确保没有线程应该在不一致的状态下看到彼此的数据。例如,银行服务器。其中一个线程在帐户中进行汇款,另一个线程正在为客户生成月度报告。
公共类方法
方法 |
说明 |
abort_on_exception |
它返回全局"异常中止"条件的状态。默认值为真。当它设置为 true 时,如果在任何线程中引发异常,所有线程都将中止。 |
abort_on_exception= |
当它设置为 true 时,如果引发异常,所有线程都将中止。它返回新状态。 |
current |
返回当前正在执行的线程。 |
exclusive{block} |
它将块包装在一个单独的块中,返回块的值。 |
exit |
它终止当前运行的线程并调度另一个线程运行。 |
kill(thread) |
它导致给定的线程退出。 |
fork([args]*){|args| block} |
与::new方法基本相同。 |
handle_interrupt(hash){...}
|
更改异步中断时序。 |
list |
为所有可运行或已停止的线程返回一个线程对象数组。 |
main |
返回主线程。 |
new{...}/new(*args, &proc)/new(*args){|args|...} |
它创建一个执行给定块的新线程。 |
pass |
它给线程调度程序一个提示,将执行传递给另一个线程。正在运行的线程可能会也可能不会切换,具体取决于操作系统。 |
pending_interrupt?(error = nil) |
返回异步队列是否为空。 |
start([args]*){|args|block} |
与::new方法基本相同。 |
stop |
它停止当前线程的执行,使其进入"睡眠"状态并安排另一个线程的执行。 |
公共实例方法
方法 |
说明 |
thr[sym] |
它使用字符串或符号名称返回光纤局部变量的值。 |
thr[sym]= |
它使用字符串或符号名称创建光纤局部变量的值。 |
abort_on_exception |
它为 thr 返回"异常中止"状态。 |
abort_on_exception= |
当设置为 true 时,如果在此 thr 中引发异常,所有线程都将中止。 |
add_trace_func(proc) |
添加 proc 作为跟踪处理程序。 |
alive? |
如果 thr 正在运行或睡眠,则返回 true。 |
backtrace |
它返回当前目标的回溯。 |
backtrace_locations(*args) |
它返回前面目标的执行堆栈。 |
exit/kill/terminate |
它终止 thr 并执行另一个线程来运行。 |
group |
它返回包含给定线程的 ThreadGroup 或返回 nil。 |
inspect |
它将 thr 的名称、id 和状态转储到一个字符串中。 |
join |
调用线程将挂起执行并运行此线程。 |
key?(sym) |
如果给定的字符串作为光纤局部变量存在,则返回 true。 |
keys |
它返回一个包含光纤局部变量名称的数组。 |
pending_interrupt?(error=nil) |
返回目标线程的异步队列是否为空。 |
priority |
返回thr的优先级 |
priority= |
它将thr的优先级设置为整数。 |
kill |
它的作用与退出相同。 |
raise |
它从给定的线程引发异常。 |
run |
它会唤醒 thr,使其符合调度条件。 |
safe_level |
它返回对 thr 有效的安全级别。 |
set_trace_func(proc) |
它在 thr 上建立 proc 作为处理程序。 |
status |
返回thr的状态 |
stop? |
如果 thr 正在睡眠 o 则返回 truer 死了。 |
terminate |
它终止 thr 并安排另一个线程运行。 |
thread_variable?(key) |
如果给定的字符串作为线程局部变量存在,则返回真。 |
thread_variable_get(key) |
它返回已设置的线程局部变量的值。 |
thread_variable_set(key, value) |
使用键值设置本地线程。 |
thread_variable |
它返回一个线程局部变量数组。 |
value |
它等待 thr 完成,使用 join 并返回其值。 |
wakeup |
使给定线程有资格进行调度,尽管它可能仍然在 I/O 上保持阻塞。 |