Как избежать проблем параллелизма - разные потоки (события) влияют на массив объектов (например, значения карты) - PullRequest
0 голосов
/ 02 июня 2019

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

У меня угловой сервис с картой объектов (владельцев).Эти объекты обновляются - каждую секунду (через интервал (1000)) - здесь мне нужно перебрать все объекты и увеличить определенное свойство - в любое время, когда приходит уведомление о веб-сокете - тогда я получаю объект с карты и обновляю несколько свойств.(Обновление объектов будет иметь более высокий приоритет каждую секунду)

Так что мои вопросы будут такими:

  1. Есть ли проблема вообще - например, если я перебираюмассив при отправке уведомления через веб-сокет?(Я не уверен, что происходит ... Я никогда не видел какого-то исключения из параллелизма в Typescript / JavaScript.)
  2. Было бы хорошей идеей "объединить" эти 2 потока - например, с помощью mergeMap ()?
  3. Есть ли способ дать привилегию первому (второму) потоку?
  4. Будет ли иметь значение обработка частей в операторе tap ()?Я надеюсь, что внутри части крана копия массива выполняется асинхронно в фоновом режиме и по окончании фиксирует результат в функции обратного вызова подписки.
private tick(): void {
    of(this.map, asap)
        .pipe(tap((map: Map<number, Holder>) => Array
            .from(map.values())
            .filter((holder: Holder) => holder.isActive())
            .forEach((holder: Holder) => holder.tick()))
        )
        .subscribe((map: Map<number, Holder>) => this._map$.next(Lodash.cloneDeep(map)));
} 
private tick(): void {
    Array.from(this.map.values())
        .filter(holder => holder.isActive())
        .forEach((holder: Holder) => holder.tick());
    this._map$.next(Lodash.cloneDeep(this.map));
}
Любые намеки на то, каким может быть наиболее эффективный подход?

Итак, на самом деле мой вопрос: как бороться с несколькими событиями, влияющими на одну коллекцию - возможно, в одно и то же время?

простите за мой английский и заранее большое спасибо! Аксель

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...