#ruby-on-rails #ruby #multithreading #concurrency #hanami
#ruby-on-rails #ruby #многопоточность #параллелизм #hanami
Вопрос:
У меня есть очень простое веб-приложение Ruby (в настоящее время в Hanami и в Rails), которое предоставляет конечным пользователям функции написания сценариев на VBS.
В настоящее время это все еще в Windows.
Конечный пользователь просто заполняет форму, а веб-приложение запускает соответствующий скрипт и возвращает пользователю либо запрошенные данные, либо просто уведомление об успехе / сбое.
Проблема, которую я имею и не могу решить, заключается в том, что все последующие запросы ожидают завершения текущего.
Я использую Hanami или Rails с Puma или Thin. Результатом всегда является последующая обработка. Несмотря на то, что это все еще в разработке, я также попробовал рабочий режим с Hanami.
Для Rails я также пытался удалить Rack:: Lock, но безрезультатно.
Сам скрипт VBS переведен на Ruby через win32ole lib.
Забавно, что если я запущу тот же скрипт из простого файла .rb вот так:
threads = []
threads << Thread.new{
my_method(arg1, arg2)
}
threads << Thread.new{
my_method(arg1, arg2)
}
threads << Thread.new{
my_method(arg1, arg2)
}
threads.each {|t| t.join}
они выполняются параллельно.
EDIT start: custom logs for pure ruby script
Connection [3] is opened at: 2019-02-25 10:11:10 0100
Connection [4] is opened at: 2019-02-25 10:11:10 0100
Connection [5] is opened at: 2019-02-25 10:11:13 0100
User in connection [3] is logged in at: 2019-02-25 10:11:15 0100
User in connection [4] is logged in at: 2019-02-25 10:11:16 0100
User in connection [5] is logged in at: 2019-02-25 10:11:19 0100
Params in connection [4] are set in system at: 2019-02-25 10:11:20 0100
Params in connection [3] are set in system at: 2019-02-25 10:11:21 0100
System in connection [4] is closed at: 2019-02-25 10:11:21 0100
System in connection [3] is closed at: 2019-02-25 10:11:26 0100
Params in connection [5] are set in system at: 2019-02-25 10:11:26 0100
System in connection [5] is closed at: 2019-02-25 10:11:27 0100
Connection [0] is opened at: 2019-02-25 10:11:03 0100
Connection [1] is opened at: 2019-02-25 10:11:03 0100
Connection [2] is opened at: 2019-02-25 10:11:05 0100
User in connection [0] is logged in at: 2019-02-25 10:11:08 0100
User in connection [2] is logged in at: 2019-02-25 10:11:10 0100
User in connection [1] is logged in at: 2019-02-25 10:11:10 0100
Params in connection [0] are set in system at: 2019-02-25 10:11:12 0100
Params in connection [1] are set in system at: 2019-02-25 10:11:12 0100
System in connection [0] is closed at: 2019-02-25 10:11:13 0100
System in connection [1] is closed at: 2019-02-25 10:11:17 0100
Params in connection [2] are set in system at: 2019-02-25 10:11:17 0100
System in connection [2] is closed at: 2019-02-25 10:11:19 0100
В журналах выше показаны только секунды, но все же можно видеть, что действия не полностью последовательны. Кроме того, я вижу, что скрипты параллельно открывают окна и выполняют действия, тогда как с веб-приложением ясно, что второе окно скрипта не открывается, пока не будет закрыто первое.
EDIT end
EDIT 2 start -- nginx implementation
Я добавил nginx в микс, и результат тот же. Веб-приложение по-прежнему последовательно выполняет сценарии в запросах.
EDIT 2 end
Я застрял и больше не знаю, куда идти дальше для отладки.
У кого-нибудь есть какие-нибудь идеи? Спасибо.
seba
Комментарии:
1. Вы абсолютно уверены, что они выполняются параллельно? Как приведенный вами код доказывает это?
2. Пожалуйста, посмотрите мою правку выше.
3. Используете ли вы selenium? Возможно, это однопоточная часть.
4. Нет, я не использую selenium.
5. Как выглядит ваша конфигурация puma? Вы настроили его на использование более одного потока?