Ruby 线程

17 Mar 2025 | 6 分钟阅读

线程意味着轻量级子进程。它是一个独立的执行路径。在 Ruby 中,可以通过使用多线程在程序内部拆分任务,或者通过使用多进程在不同程序之间拆分任务,使程序的各个部分同时运行。

线程是 Ruby 并发编程模型的实现。


Ruby多线程

一个普通的程序只有一个执行线程。程序中的所有语句都按顺序执行。

一个多线程程序包含多个执行线程。它使用的内存空间更少,并共享相同的地址空间。多线程用于一次执行多个任务。

使用 thread.new 调用创建一个新线程。它与主线程的执行不同。


线程初始化

为了创建一个新线程,Ruby 提供了三个关键字,即 ::new、::start::fork

要启动一个新线程,可以将一段代码块与对 Thread.new、Thread.startThread.fork 的调用相关联。 线程将被创建。当代码块退出时,新线程退出。

语法


线程终止

在 Ruby 中有不同的方法来终止线程。要退出给定的线程,可以使用类 ::kill

语法


Ruby 线程示例

输出

Ruby Thread 1


线程生命周期

线程一旦创建,就不需要启动它。 当它获得适当的 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。 当设置为 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 并执行另一个线程来运行。
它返回包含给定线程的 ThreadGroup,如果不存在则返回 nil。
inspect它将 thr 的名称、id 和状态转储到字符串中。
join调用线程将暂停执行并运行此 thr。
key?(sym)如果给定的字符串作为光纤局部变量存在,则返回 true。
keys它返回光纤局部变量名称的数组。
pending_interrupt?(error=nil)返回目标线程的异步队列是否为空。
优先级它返回 thr 的优先级。
priority=它将 thr 的优先级设置为整数。
kill它的工作方式与 exit 相同。
raise它从给定的线程引发异常。
run它唤醒 thr,使其有资格进行调度。
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(key, value)将带有 key 的线程局部变量设置为 value。
thread_variable它返回线程局部变量的数组。
它等待 thr 完成,使用 join 并返回其值。
wakeup使给定的线程有资格进行调度,尽管它可能仍然在 I/O 上阻塞。

下一主题Ruby LDAP