Массовая загрузка данных с ограничителем
Итак, я пишу функцию, которая в основном загружает данные и сохраняет их в БД. Во-первых, я просто сформулировал это как
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
Я не проверял его, так как ваш код не был запущен. Это помогает?