揭开 Ruby 的神秘面纱♦️(1/3):这一切都与线程有关

主要观点:

  • Ruby 是动态、解释型、开源编程语言,以简单、高效及“易读”语法著称,常用于 Web 开发,支持多种编程范式,最知名的 Ruby VM 是 Matz Ruby Interpreter(MRI)。
  • MRI 实现了全局解释器锁(GIL),限制了真正的并行性,Ruby 多线程但并行度为 1。许多流行 Gem 如 Puma、Sidekiq 等是多线程的。
  • 介绍了 Ruby 中处理并发和并行的多个层次,包括 Process、Ractor、Thread 和 Fiber。

    • Process 可在不同终端或使用fork实现并行,由操作系统调度,内存隔离。
    • Ractor 是新的实验性特性,利用原生线程实现并行,每个 Ractor 有独立内存和 GIL,避免竞争条件,用于分发密集 CPU 任务。
    • Ruby 线程由解释器管理,受 GIL 限制,只能并发不能真正并行,可通过priorityThread.pass控制线程,但易导致竞争条件,MRI 内部结构非线程安全。
    • Fiber 是轻量级协作式并发机制,通过Fiber.newFiber.yieldFiber.resume控制,共享内存,常用于构建生成器。
  • Ruby 提供多种并发模型,适用于不同任务,如 Process 适合资源密集型任务,Ractor 用于安全并行,Thread 需注意同步,Fiber 用于构建生成器等。

关键信息:

  • Ruby 相关工具和框架:Ruby on Rails、Puma、Sidekiq 等。
  • 重要特性及限制:GIL 限制 Ruby 线程并行性,不同并发机制的特点及适用场景。
  • 实验性特性及注意事项:Ractor 实验性强,使用时需注意诸多问题;Fiber 是低级别接口,应避免大量基于其构建代码。

重要细节:

  • 展示了各种并发机制的代码示例,如 Ractor 计算并行和顺序执行时间、Thread 控制线程执行、Fiber 实现懒生成等。
  • 提及不同并发模型在日常代码中的使用建议,如一般不建议使用 Thread,Fiber 可用于构建 Generator 等。
  • 以 Puma 和 Unicorn 的辩论为例,说明根据任务选择合适并发模型的重要性。
阅读 22
0 条评论