Написание сценариев на VBS через Ruby web app — проблемы с многопоточностью

#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? Вы настроили его на использование более одного потока?