在多线程 ruby 执行中,除非您使用那些释放 GVL 的函数,否则您无法并行执行线程。
据我了解,以下 ruby 方法可以释放 GVL:
Kernel#sleep
IO#read
和IO#write
问题
- 在纯红宝石中,还有其他释放 GVL 的方法吗?
版本
- 我目前使用的是 ruby 2.6 版,所以期待这个版本的信息。
我在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 的方法。
在纯红宝石中,还有其他释放 GVL 的方法吗?
在纯 Ruby 中,没有 GVL 这样的东西。GVL 是 Ruby 特定实现的某些特定版本的一项功能。绝大多数Ruby 实现都没有 GVL,甚至没有类似的东西。
我目前使用的是 ruby 2.6 版,所以期待这个版本的信息。
这适用于所有版本的 Ruby。没有任何版本的 Ruby 指定存在 GVL。并且,任何未来版本的 Ruby 都将是非常值得怀疑的。