Является ли Ruby Net:: HTTP потокобезопасным?

Является ли Ruby Net:: HTTP-потоковым?

(Помимо методов version_1_1 и version_1_2, о которых он явно говорит, нет)

Ответ 1

Я бы не рассчитывал на это.

В 2008 году matz написал:

Для MRI (1.8.x) и YARV (1.9.x) каждый реализованный C-метод защищенный GIL (Global Interpreter Lock), так что вам не нужно беспокоюсь о. Но это может зависеть от каждой реализации.

Net:: HTTP находится в stdlib, что означает, что он не реализован в C (или, по крайней мере, не полностью реализован на C). Я предполагаю, что matz-нота на GIL по-прежнему правильна сегодня, что подразумевает, что GIL не будет помещен в Net:: HTTP. Поэтому я сомневаюсь, что это было бы поточно.

Я, к сожалению, не нашел окончательных доказательств в документах для текущей версии Ruby, хотя я считаю, что также стоит упомянуть этот бит из Concurrency в JRuby:

По крайней мере, эти классы [основные классы и классы в stdlib] не считаются потокобезопасными, и если вы намерены их мутировать одновременно с другими операциями вы захотите ввести блокировку (например, с помощью Mutex): String, Array, Hash и любые структуры данных полученных из них.

Я считаю, что было бы лучше сыграть в нее безопасно, добавив блокировки в Net:: HTTP или используя альтернативу threadafe.