Gli ETS forniscono un mezzo per fare un aggiornamento e leggi in uno, come un'operazione di incremento?

StackOverflow https://stackoverflow.com//questions/21003292

  •  20-12-2019
  •  | 
  •  

Domanda

Inizializza un tavolo ETS denominato nel mio Start (_StarType, _Startargs) -> Funzione, prima di impostare le mie routine standard di movimentazione web cowboy.

ETS: NUOVO ( Req_stats , [Named_table, Public]), ETS: insert (req_stats, { req_count , 0})

Ho questa funzione:

 count_req()->
    [{_,Cnt}]=ets:lookup(req_stats,req_count),
    ets:insert(req_stats,Cnt+1),
    Cnt+1.
.

La mia preoccupazione è questa;

Se chiamo count_req () per ogni richiesta Web in carico elevato, molto probabilmente finirò con un conteggio inaccurato, perché [{_, cnt}]= ETS: ricerca (req_stats, req_count) potrebbe essere aggiornato più volte prima di tornare CNT + 1

ETS fornisce un mezzo per eseguire un aggiornamento e leggi in uno, come un'operazione di incremento?

Grazie.

È stato utile?

Soluzione

Puoi usare ETS: update_counter / 3 :

ets:update_counter(req_stats, req_count, {2, 1})
.

cioè, incrementare il 2 ° elemento della tupla per 1 e restituire il nuovo valore.


.

in ERLANG / OTP 18.0 (Rilasciato il 2015-06-24), è stato introdotto generacodicitagcode.Ti consente di fornire un valore predefinito, da utilizzare se la chiave non è ancora presente nella tabella.Quindi, se vuoi che il contatore diventi 1 dopo la prima volta che l'hai incrementato, dà 0 come valore predefinito:

1> ets:new(req_stats, [named_table]).
req_stats
2> ets:tab2list(req_stats).
[]
3> ets:update_counter(req_stats, req_count, {2, 1}, {req_count, 0}).
1
4> ets:tab2list(req_stats).
[{req_count,1}]
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top