Массовая загрузка данных с ограничителем

Итак, я пишу функцию, которая в основном загружает данные и сохраняет их в БД. Во-первых, я просто сформулировал это как

function storedata(url_list)
  for url in url_list
    data = downloaddata(url)
    savedataindb(data)
  end
end

Но в этом случае загрузка была довольно медленной (я предполагаю, что сервер данных сам ограничивает скорость), поэтому я асинхронизировал все загрузки, чтобы я мог сделать несколько вызовов загрузки одновременно

function storedata(url_list)
  @sync for url in url_list
    @async savedataindb(downloaddata(url))
  end
end

Это работает и загружается довольно быстро. Но мой url_list довольно большой, и это просто делает слишком много обращений к серверу данных, и сервер данных блокирует меня. Итак, я подумал, что вместо этого я буду создавать пакеты определенного размера для асинхронной загрузки следующим образом.

function storedata(url_list)
  batches = divide(url_list)
  @sync for batch in batches
    @async for url in batch
      savedataindb(downloaddata(url))
    end
  end
end

Но это также не решает проблему. Та же самая предыдущая проблема остается.

Как мне реализовать эту функцию, чтобы я мог выполнять несколько вызовов загрузки одновременно, но также ограничивал их (в некотором смысле) одновременно?

1 ответ

Ваш код не полностью воспроизводим, но если length(batches) мал, то должно работать хорошо, я думаю (то есть, когда количество записей в batches сбор - это способ ограничения количества асинхронных запросов).

Если, с другой стороны, вы делаете каждую запись batches тот же размер, то есть когда length(batch) маленький и настроен на ограничение, которое ваш сервер принимает, вы можете проверить:

function storedata(url_list)
  batches = divide(url_list)
  for batch in batches
    @sync for url in batch
      @async savedataindb(downloaddata(url))
    end
  end
end

Я не проверял его, так как ваш код не был запущен. Это помогает?

Другие вопросы по тегам