2010-06-17 63 views
10

Ruby的Net :: HTTP线程安全吗?Ruby的Net :: HTTP线程安全吗?

(除了version_1_1和version_1_2方法,它明确地说,是不是)

+1

假设你不在MacRuby或JRuby上,它有关系吗?无论如何,运行时并不是真正的多线程,一次只能运行一个线程。 – Theo 2010-06-20 19:41:52

+0

无所谓?所以如果net:http为你的连接维护一些全局状态并且运行时间在两个线程之间来回切换,那么什么都不会出错?我不知道是否net:http是线程安全的,但我确实知道你的答案是错误的。 – bridiver 2014-05-29 12:35:42

回答

2

我不会指望它。

2008年,matz wrote

对于MRI(1.8.x的)和YARV(1.9.x的),每一个C语言实现的方法是通过 GIL(全局解释器锁)的保护,让你不” t不得不为 担心。但它可能取决于每个实施。

Net :: HTTP在stdlib中,这意味着它没有在C中实现(或者至少没有在C中完全实现)。我假设matz关于GIL的说明今天仍然正确,这意味着GIL不会放在Net :: HTTP上。因此,我怀疑它会是线程安全的。

我不幸没有找到确切的证据在文档的Ruby的当前版本,但我觉得这也是值得Concurrency in jruby提这一点:

至少这些类[核心类和类stdlib]是 不被认为是线程安全的,并且如果您打算在其他操作的同时将它们变异 您将要引入锁定 (例如与Mutex):String,Array,Hash以及从它们派生的任何数据结构 。

我觉得最好是通过在Net :: HTTP中添加锁或使用线程安全替代方法来安全地播放它。

+0

如何添加锁@nick – bcackerman 2017-08-11 23:54:14

+0

这取决于您的用例,您可能只需将每个请求视为原子。如果您需要帮助,请打开一个新问题,或者使用另一个已证明是线程安全的库。 – 2017-08-12 01:07:07