Как выбрать случайный элемент из набора ets в Erlang / Elixir? - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть большое количество процессов, которые мне нужно отслеживать в наборе ets, а затем случайным образом выбирать отдельные процессы.Поэтому я создал набор следующим образом:

:ets.new(:pid_lookup, [:set, :protected, :named_table])

, а затем для аргумента давайте просто добавим self() в него 1000 раз:

Enum.map 1..1000, fn x -> :ets.insert(:pid_lookup, {x, self()}) end

Теперь мне нужно выбрать один случайным образом.Я знаю, что мог бы просто выбрать случайный, используя :ets.lookup(:pid_lookup, :rand.uniform(1000)), но что, если я заранее не знаю размер набора (в вышеупомянутом случае, 1000)?

Как узнатьразмер набора ets?И / или есть ли лучший способ выбрать случайный pid из структуры данных ets?

1 Ответ

0 голосов
/ 11 декабря 2018

Как я понял из комментариев, это проблема XY .

Что вам по сути нужно, это отследить изменяющийся список и выбрать один из его элементов случайным образом.ETS в целом и :ets.set в частности ни в коем случае не предназначены для запроса размера.Они служат различным целям.

Создают Agent в вашем дереве наблюдения, хранят список PID уже запущенных серверов и используют Kernel.length/1, чтобы запросить его размер, или даже использовать Enum.random/1 если список не действительно огромный (последний перебирает все перечисляемое, чтобы получить случайный элемент.)

...