2010-07-15 6 views
2

Я использую сервис Amazon S3 для загрузки различных каталогов (и файлов внутри) в разные ковши (каталог -> ведро). Я кодирую в Ruby, и я использую lib http://amazon.rubyforge.org.Параллельная загрузка в Amazon S3 с использованием Ruby и amazon.rubyforge.org

Файлы небольшие (около 20 КБ).

Я хотел бы, чтобы загрузить каталоги параллельно (с использованием большого количества потоков), но я должен использовать синхронизацию по S3Object.store

@mutex.synchronize do 
    S3Object.store(s3_obj_name, open(image_name), bucket_name) 
end 

Если я не использую функцию синхронизации я получаю Net::HTTPBadResponse исключение! Итак, с синхронизацией я потерял преимущества использования параллельного программирования.

У вас есть некоторые идеи о том, как добиться успеха при параллельной загрузке?

Спасибо, Alessandro DS

ответ

4

Оказывается, что рубин s3 библиотеки вы используете не поточно: http://rubyforge.org/tracker/index.php?func=detail&aid=8162&group_id=2409&atid=9357

Так что ваши варианты включают в себя:

  • Написать патч для этой библиотеки, чтобы сделать ее потокобезопасной (я не рубиновый парень, не уверен, как это трудно сделать)
  • Найти другую библиотеку Ruby S3, которая является потокобезопасной (я искал ее и не использовал) t увидеть что-либо очевидное)
  • Напишите короткий скрипт ruby, который выполняет один вызов S3Object.store, и выполните это из родительского рубинового скрипта. Затем каждый вызов store() будет проходить в отдельном процессе, и проблема безопасности потока не укусит вас

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

Смежные вопросы