Как разделить pouchDB между основным потоком и веб-работником - PullRequest
1 голос
/ 06 февраля 2020

В веб-приложении, использующем pouchDB , у меня есть медленно работающая функция, которая завершается обновлением документа в БД. Я хочу переместить его из основного потока пользовательского интерфейса в веб-работника. Тем не менее, у нас есть много другого кода, использующего pouchDB, по-прежнему в основном потоке (например, прослушиватель событий change, но также и код, который имеет дело с другими документами). (Для справки размер базы данных составляет порядка 100 МБ; используется Vue2, поэтому, как правило, пользовательский интерфейс может обновляться при изменении данных.)

Здесь я, кажется, сразу же отклеиваюсь:

  • Общая память в основном отсутствует, так как все браузеры отключают ее по умолчанию
  • Даже если это не так, pouchDB является классом и не может быть передан (?).
  • Изоляция всего кода БД, включая обработчик изменений, в одного веб-работника - это огромный рефакторинг; и затем у нас все еще остается проблема передачи огромных порций данных в и из этого веб-работника.
  • Переместите весь код, который использует данные, также в веб-работника, и просто пропустите поток пользовательского интерфейса Сообщения туда и обратно, это еще больший рефакторинг, и я не думал, как это может помешать Vue.

Это, кажется, оставляет нам выбор из двух крайностей. Либо переписайте все приложение с нуля, возможно, отбросив Vue, либо просто сделайте медленный, сложный расчет в веб-работнике, затем попросите его вернуть результат и продолжить выполнение db.put() в основном потоке пользовательского интерфейса. .

Это действительно ситуация "все или ничего"? Существуют ли какие-либо «хитрости» PouchDB, позволяющие работать с веб-работниками, и если да, то потребуется ли нам блокировка?

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

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

Вам нужно только "обернуть" методы, которые вам нужны в работнике. Я рекомендую написать класс или набор функций, которые будут асинхронными c в вашем работнике, чтобы сделать код читабельным.

Вам не нужно беспокоиться о количестве передаваемых данных. Сериализация и десериализация довольно быстрая, и передача в основном memcpy, так что это не займет разумного времени.

0 голосов
/ 30 марта 2020

Я нашел этот плагин адаптера, который, я думаю, считается "трюком PouchDB", за которым я был: https://github.com/pouchdb-community/worker-pouch

Это было тривиально добавить (см. Ниже), и он имеет использовался в производстве в течение 6-7 недель, и, кажется, исправил проблемы, которые мы видели. (Я говорю, что появляется , так как трудно увидеть, что он имеет какой-либо эффект, и у нас не было хорошего способа воспроизвести проблемы замедления, которые видели пользователи.)

const PouchDB = require('pouchdb-browser').default
const pouchdbWorker = require('worker-pouch')
PouchDB.adapter('worker', pouchdbWorker)

Настоящий код подобен этому, но usePouchDBWorker всегда сохранялся как true:

const PouchDB = require('pouchdb-browser').default
// const pouchdbDebug = require('pouchdb-debug')
if (usePouchDBWorker) {
  const pouchdbWorker = require('worker-pouch')
  PouchDB.adapter('worker', pouchdbWorker)
}

Этот код используется как в веб-приложениях, так и в сборках Electron. Веб-приложение никогда не используется со старыми веб-браузерами, поэтому читайте сайт github, если это может быть проблемой для вашего собственного варианта использования.

...