Как я могу ожидать ответа одного и того же множества? - PullRequest
0 голосов
/ 24 февраля 2019

Привет, ребята, я перехожу из Python3 в Go, поэтому я пытаюсь переписать библиотеку, созданную для повышения производительности.

я столкнулся с проблемой из-за того, что я noob в Golang XD, я используюограниченный API для загрузки сотен jsons, и я хочу использовать как можно меньше запросов, когда могу.поэтому при загрузке этих файлов jsons некоторые из используемых URL дублируются, и первая идея, которую я получил, - передать карту [stringLink] * myJsonReceived между моими функциями загрузки (goroutines) и каждой goroutine перед загрузкой проверяет, обрабатывается ли ссылка другой.поэтому вместо того, чтобы запрашивать его снова и тратить впустую вызовы Bandwidth + API, ему следует просто подождать, пока другая программа завершит его загрузку и получить его из словаря.

У меня есть несколько вариантов:

1) программа должна проверить, находится ли ссылка на карте, если это так, она проверяет каждые 0,05 секунды, если указатель в словаре все еще равен нулю или содержит json.(вероятно, самый плохой способ, но это работает)

2) изменить карту, переданную между goroutines, на (map [stringlink] chan myjson), это, вероятно, самый эффективный способ, но я понятия не имею, как отправить одно сообщениеканал и получить его несколькими ожидающими Goroutines.

3) я могу использовать Option (2), добавив в структуру счетчик, и каждый раз, когда программа обнаруживает, что URL-адрес уже запрошен, он просто добавляет +1 к счетчику и ждите ответа от канала, когда загрузка программы завершится, он отправит X сообщений на канал.но этот способ заставит меня добавить слишком много блокировок на карту, что является пустой тратой производительности.

Примечание: мне нужна карта в конце выполнения всех функций, чтобы сохранить загруженные Jsons в мою базу данных, чтобы никогда не загружатьих снова.

Спасибо всем заранее за вашу помощь.

1 Ответ

0 голосов
/ 24 февраля 2019

Что бы я хотел решить вашу задачу, я бы использовал для этого пул маршрутизации.Там будет производитель, который отправляет URL-адреса на канал, и рабочие программы будут варьироваться по этому каналу для получения URL-адресов для обработки (выборки).После того, как URL «готов», та же рабочая программа может также сохранить его в базе данных или передать результат по каналу результатов для «сборщика» программы, которая может выполнить сохранение последовательно, если это будет требованием.

Эта конструкция по замыслу гарантирует, что каждый URL, отправленный на канал, получит только одна рабочая программа, поэтому вам не нужна никакая другая синхронизация (которая понадобится вам в случае использования общей карты).Подробнее о каналах см. Для чего используются каналы Голанга?

Go поддерживает связь между программами (каналами) через общие переменные.Цитирование из Effective Go: делитесь, общаясь :

Не общайтесь, разделяя память;вместо этого делитесь памятью, общаясь.

Пример создания рабочих пулов см. в Это пул идиоматических рабочих потоков в Go?

...