2010-06-17 100 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