2

在多线程 ruby​​ 执行中,除非您使用那些释放 GVL 的函数,否则您无法并行执行线程。

据我了解,以下 ruby​​ 方法可以释放 GVL:

  • Kernel#sleep
  • IO#readIO#write

问题

  • 在纯红宝石中,还有其他释放 GVL 的方法吗?

版本

  • 我目前使用的是 ruby​​ 2.6 版,所以期待这个版本的信息。
4

2 回答 2

1

我在stackoverflow(日语)上问了同样的问题。

得到了这个答案https://ja.stackoverflow.com/a/55579/754,其中说明

  • Bignum 的 div / 模数
  • Dir.new/Dir.open
  • 目录.chdir
  • 目录.rmdir
  • 目录是空的吗?
  • 目录.glob
  • 文件.chown
  • 文件检查文件状态的方法,即 stats
  • 文件.重命名
  • 文件截断
  • 文件.mkfifo
  • IO.copy_stream
  • IO.#open 和 IO.#close 相关代码(太复杂了,看不懂)
  • 内核.#system
  • 内核.#exec

在 fiddle、openssl、readline、socket 等其他标准库中,zlib 实际上调用了释放 GVL 的方法。

这个很好的答案是由https://stackoverflow.com/users/4944814/raccy写的

于 2021-01-10T16:41:33.817 回答
0

在纯红宝石中,还有其他释放 GVL 的方法吗?

在纯 Ruby 中,没有 GVL 这样的东西。GVL 是 Ruby 特定实现的某些特定版本的一项功能。绝大多数Ruby 实现都没有 GVL,甚至没有类似的东西。

我目前使用的是 ruby​​ 2.6 版,所以期待这个版本的信息。

这适用于所有版本的 Ruby。没有任何版本的 Ruby 指定存在 GVL。并且,任何未来版本的 Ruby 都将是非常值得怀疑的。

于 2019-02-14T21:39:14.907 回答