本文概述
线程表示轻量级子进程。这是一条单独的执行路径。在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类方法使当前正在运行的线程进入睡眠状态并安排另一个线程的执行。线程进入睡眠状态后, 将使用实例方法唤醒将线程标记为可进行调度。
:: pass类方法尝试将执行传递给另一个线程。是否要切换正在运行的线程取决于操作系统。
线程优先级提示了根据线程的优先级调度线程。高优先级线程首先被调度。它还取决于操作系统。线程可以在执行第一个操作时增加或减少其自身的优先级。
线程排除
Ruby线程排除法指出, 当两个线程共享同一数据并且其中一个线程修改该数据时, 我们需要确保没有线程可以看到彼此处于不一致状态的数据。例如, 银行服务器。一个线程负责帐户中的资金转帐, 而另一个线程正在为客户生成月度报告。
公共方法
Method | Description |
---|---|
abort_on_exception | 它返回全局”异常中止”条件的状态。默认值为true。设置为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 | 它为线程调度程序提供了将执行传递给另一个线程的提示。正在运行的线程可能会或可能不会切换, 具体取决于操作系统。 |
待处理中断?(错误=无) | 它返回异步队列是否为空。 |
start([args]*){|args|block} | 它基本上与:: new方法相同。 |
stop | 它停止当前线程的执行, 使其进入”睡眠”状态并计划另一个线程的执行。 |
公共实例方法
Method | Description |
---|---|
thr[sym] | 它使用字符串或符号名称返回光纤局部变量的值。 |
thr[sym]= | 它使用字符串或符号名称创建光纤局部变量的值。 |
abort_on_exception | 它返回thr的”异常终止”状态。 |
abort_on_exception= | 设置为true时, 如果此线程中引发异常, 则所有线程将中止。 |
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 | 它苏醒, 使它有资格进行调度。 |
safe_level | 它返回thr有效的安全级别。 |
set_trace_func(proc) | 它在thr上建立proc作为处理程序。 |
status | 它返回thr的状态。 |
stop? | 如果thr正在睡眠或已死, 则返回true。 |
terminate | 它终止thr并安排另一个线程运行。 |
thread_variable?(key) | 如果给定的字符串作为线程局部变量存在, 则返回true。 |
thread_variable_get(key) | 它返回已设置的线程局部变量的值。 |
thread_variable_set(键, 值) | 将本地线程设置为value。 |
thread_variable | 它返回线程局部变量的数组。 |
value | 它使用连接等待thr完成, 并返回其值。 |
wakeup | 使给定线程有资格进行调度, 尽管它仍可能在I / O上处于阻塞状态。 |
评论前必须登录!
注册