Отправка больших списков между процессами в Erlang / Elixir

Предположим, вы хотите отправить большой список (например, 1_000_000 записей) другому процессу в Erlang / Elixir.

  • Блокируется ли send до тех пор, пока не будут отправлены данные всего списка, или это каким-то образом выполняется асинхронно виртуальной машиной Erlang?
  • Простая отправка списка - плохая практика? Какие есть альтернативы?

person Luca Fülbier    schedule 26.01.2017    source источник
comment
Не думаю, что это хорошая идея. Отметьте этот вопрос - ›stackoverflow.com/questions/5394566/   -  person NoDisplayName    schedule 26.01.2017
comment
Вы могли бы использовать ets для хранения ваших данных и передачи ссылок на таблицы (ы) ) вокруг.   -  person nietaki    schedule 26.01.2017


Ответы (1)


  • И да и нет. Копирование огромной структуры блокирует не получателя, а отправителя. См. мой ответ на аналогичный вопрос.
  • Yes, it is bad practice if you do it regularly. Alternatively:
    1. Refactor your code so you could partition data to different processes.
    2. Хранить данные в ets. (Это не волшебная палочка, вы по-прежнему копируете данные в ets и из него, но это зависит от вашего шаблона доступа.)
    3. Храните данные как двоичные.

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

person Hynek -Pichi- Vychodil    schedule 26.01.2017
comment
Я просто спросил из любопытства, так как в настоящее время я сталкиваюсь с передачей большого списка данных между двумя потоками в Java. Параллелизм в Java - настоящая проблема, поэтому мне было интересно, как я буду делать то же самое в Elixir, который использует передачу сообщений. Если бы мне пришлось решить то же самое в Elixir, я бы, вероятно, использовал таблицу ets или отдельный процесс, который, как вы сказали, предоставляет шаблон доступа, подобный списку. - person Luca Fülbier; 26.01.2017
comment
@ LucaFülbier: имейте в виду, что даже если вы будете использовать прокси-процесс со списковым API, вы все равно можете столкнуться с длинными паузами GC из-за большого размера кучи. Природа генерации сборщика мусора Erlang может помочь, но время от времени вы будете видеть долгую паузу в ответе этого процесса, похожую на поведение Java. - person Hynek -Pichi- Vychodil; 26.01.2017