Зачем использовать пул в блестящем приложении?

В нескольких местах (1, 2) Я нахожу следующее заявление о том, почему я должен использовать пакет пула (https://github.com/rstudio/pool), чтобы управлять подключениями к базе данных в приложении Shiny:

Открытие только одного соединения для каждого приложения… не может обрабатывать одновременные запросы (например, открыты два сеанса, оба запрашивают базу данных одновременно);

Мое понимание блестящих приложений заключается в том, что они выполняются в однопоточном процессе R, поэтому никогда не может быть двух запросов одновременно. Я что-то пропустил здесь? Зачем мне нужен пул из нескольких подключений для каждого приложения, если в любом случае в любое время используется только одно?

(Я понимаю, что пул с одним соединением все еще может быть полезен, поскольку пакет пула обрабатывает автоматическое повторное соединение в случае разрыва соединения.)

-- Спасибо, Дэвид


person David K    schedule 14.12.2020    source источник
comment
pool относится не к нескольким R процессам, а к соединениям с базой данных.   -  person Trusky    schedule 14.12.2020
comment
@Trusky Но я не могу придумать вариант использования для нескольких подключений (к одной и той же БД) в одном процессе R (по крайней мере, всегда есть лучшая альтернатива только с одним подключением).   -  person David K    schedule 14.12.2020


Ответы (1)


Сервер Shiny может обслуживать нескольких конечных пользователей с помощью однопоточного процесса R. См. схему и описание в начале этой статьи. Процесс R чередует пользователей, с которыми он работает в любой конкретный момент. Все эти несколько пользователей могут делать разные запросы к вашей БД в течение перекрывающихся интервалов времени.

Предположим, у вас есть блок кода, который делает несколько запросов к БД. Вы можете думать об этом большом блоке как о чем-то одном, но, возможно, процесс R считает, что он должен остановиться посередине и обслуживать другого пользователя.

person Michael Dewar    schedule 14.12.2020
comment
Но shining не переключается между сеансами пользователя в любой момент выполнения, не так ли? Он переключается только между реактивными выражениями. Занятие соединения с БД через реактивные выражения в первую очередь не похоже на надежный подход. --Дэйвид - person David K; 14.12.2020
comment
Можно использовать два соединения, хотя это немного надумано: если вы перейдете от мышления соединения к набору результатов (как в dbSendStatement(...), а затем позже и/или итеративно dbFetch), многие (большинство?) соединений в R не поддерживают несколько наборы результатов за раз, поэтому можно выбрать одно соединение для запроса с длинным возвратом, а затем второе соединение либо для тангенциального, либо просто для других соединений, повторяя первое. Я этого не делаю, и его сложности можно избежать, но... возможно, для некоторых ситуаций это лучше. - person r2evans; 14.12.2020
comment
@ r2evans Да, это может быть прецедентом для нескольких подключений, но вы все равно будете обслуживать только один сеанс за раз (хотя этот один сеанс обслуживается несколькими подключениями). - person David K; 14.12.2020