Допустим, у меня есть два скрипта на Ruby - a.rb и b.rb. Оба являются веб-парсерами, используемыми для разных страниц. Они могут работать много-много часов, и я хотел бы запускать их одновременно. Для этого я попытался запустить их третьим скриптом, используя драгоценный камень обещания со следующим кодом:
def method_1
require 'path to my file\a'
end
def method_2
require 'path to my file\b'
end
require 'future'
x=future{method_1}
y=future{method_2}
x+y
Однако это решение вызывает ошибку (см. Ниже) и выполняется только один сценарий.
An operation was attempted on something that is not a socket.
(Errno::ENOTSOCK)
Я также пробовал поиграть с классом Thread:
def method_one
require 'path to my file\a'
end
def method_two
require 'path to my file\b'
end
x = Thread.new{method_one}
y = Thread.new{method_two}
x.join
y.join
И это дает мне ту же ошибку, что и для драгоценного камня обещания.
Я также запускал эти сценарии в отдельных оболочках - тогда они работают одновременно, но производительность намного хуже (примерно на 50% медленнее). Есть ли способ запустить их одновременно и сохранить высокую производительность?
При замене require 'path to my file \{a,b}' на puts __method__ вариант Нить у меня работает нормально. Это говорит о том, что исключение возникает внутри оператора требовать.
@JohanWentholt Не могли бы вы уточнить, что мне делать? Поскольку ваше решение не указывает на мои файлы - a.rb или b.rb

Если вы открыты для альтернативных технологий. В этом случае Go & Goroutines были бы потрясающими. Ruby - не лучший язык для параллелизма, поэтому он не идеален для парсеров.