Ruby 线程17 Mar 2025 | 6 分钟阅读 线程意味着轻量级子进程。它是一个独立的执行路径。在 Ruby 中,可以通过使用多线程在程序内部拆分任务,或者通过使用多进程在不同程序之间拆分任务,使程序的各个部分同时运行。 线程是 Ruby 并发编程模型的实现。
Ruby多线程一个普通的程序只有一个执行线程。程序中的所有语句都按顺序执行。 一个多线程程序包含多个执行线程。它使用的内存空间更少,并共享相同的地址空间。多线程用于一次执行多个任务。 使用 thread.new 调用创建一个新线程。它与主线程的执行不同。
线程初始化为了创建一个新线程,Ruby 提供了三个关键字,即 ::new、::start 和 ::fork。 要启动一个新线程,可以将一段代码块与对 Thread.new、Thread.start 或 Thread.fork 的调用相关联。 线程将被创建。当代码块退出时,新线程退出。 语法
线程终止在 Ruby 中有不同的方法来终止线程。要退出给定的线程,可以使用类 ::kill。 语法
Ruby 线程示例输出 
线程生命周期线程一旦创建,就不需要启动它。 当它获得适当的 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 上阻塞。 |
|