Как я могу получить карту, к которой могут получить доступ все процессы?

Я создаю многопоточный веб-сканер.Я запускаю поток, который получает сначала ---- +: = 0 =: + ---- href ссылки и анализирует некоторые данные.Затем он должен добавить эти ссылки в список посещений, к которым могут обращаться другие потоки, и добавить данные в глобальную карту, которая будет напечатана после завершения программы.Затем поток запускает новые ---- +: = 1 =: + ---- новые потоки делают все то же самое.Как настроить глобальный список посещенных сайтов, к которому могут обращаться все потоки, и глобальную карту, на которую все потоки могут также писать.
4 голоса | спросил MikeC 1 PMpFri, 01 Apr 2016 20:08:41 +030008Friday 2016, 20:08:41

2 ответа


0
Просто чтобы прояснить, erlang /elixir использует процессы, а не потоки.Учитывая список элементов, общий подход:Пустой список с именем ---- +: = 0 =: + ---- сохраняется в ets, dets, mnesia или какой-либо БД.Новый список элементов фильтруется по списку ---- +: = 1 =: + ----, поэтому задача не повторяется без необходимости.Для каждого элемента отфильтрованного списка запускается задача (которая, в свою очередь, порождает процесс) и выполняется некоторая работа над каждым элементом, который возвращает карту требуемых данных.Посмотрите модуль Task Task.async /1, и Task.yield_many /2 могут быть полезны.После того, как все задачи возвращены или сданы,все карты или части данных на картах объединены и могут быть сохранены, если /как требуется /уместно.элементы, задачи которых не аварийно завершают работу, добавляются в список ---- +: = 2 =: + ---- в БД.Задачи, которые дают сбой или тайм-аут, могут быть обработаны по-разному.
ответил stephen_m 2 AMpSat, 02 Apr 2016 04:09:07 +030009Saturday 2016, 04:09:07
0
Вы не можете обмениваться данными между процессами.Это не значит, что вы не можете делиться информацией.Обычный способ - использовать специальный процесс (сервер), отвечающий за эту работу: поддерживать состояние;в вашем случае список посещенных ссылок.Другой способ - использовать ETS (или Mnesia базу данных, основанную на ETS), которая предназначена для обмена информацией между процессами.
ответил Pascal 1 PMpFri, 01 Apr 2016 20:47:39 +030047Friday 2016, 20:47:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132