Ste*_*oka 11 ruby multithreading
Ruby的Net :: HTTP线程是否安全?
(除了明确说明的version_1_1和version_1_2方法之外)
我不会指望它。
2008 年,matz 写道:
对于MRI(1.8.x)和YARV(1.9.x),每个C实现的方法都受到GIL(全局解释器锁)的保护,因此您不必担心。但这可能取决于每个实现。
Net::HTTP 在 stdlib 中,这意味着它没有在 C 中实现(或者至少没有在 C 中完全实现)。我假设 matz 关于 GIL 的注释今天仍然正确,这意味着 GIL 不会放置在 Net::HTTP 上。因此,我怀疑它是否是线程安全的。
不幸的是,我没有在当前版本的 Ruby 文档中找到明确的证据,尽管我觉得Concurrency in jruby中的这一点也值得一提:
至少这些类 [核心类和 stdlib 中的类] 不被认为是线程安全的,如果您打算与其他操作同时改变它们,您将需要引入锁定(例如使用互斥锁):String、Array、Hash 和从它们派生的任何数据结构。
我觉得最好通过在 Net::HTTP 周围添加锁或使用线程安全的替代方案来确保安全。