2010-07-15 5 views
2

J'utilise le service Amazon S3 pour télécharger différents répertoires (et les fichiers à l'intérieur) dans différents compartiments (répertoire -> compartiment). Je code dans Ruby, et j'utilise le lib http://amazon.rubyforge.org.Téléchargement parallèle sur Amazon S3 en utilisant Ruby et amazon.rubyforge.org

Les fichiers sont petits (environ 20 Ko).

Je voudrais télécharger les répertoires en parallèle (en utilisant plusieurs threads) mais je dois utiliser la synchronisation autour du S3Object.store

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

Si je ne l'utilise pas Synchronize j'obtenir Net::HTTPBadResponse exception! Donc, avec synchroniser, j'ai perdu les avantages de l'utilisation de la programmation parallèle.

Avez-vous des idées sur la façon de réussir le téléchargement parallèle?

Merci, Alessandro DS

Répondre

4

Il semble que la bibliothèque du rubis que vous utilisez est pas thread-safe: http://rubyforge.org/tracker/index.php?func=detail&aid=8162&group_id=2409&atid=9357

donc vos options:

  • Ecrire un patch pour cette librairie afin de sécuriser les threads (je ne suis pas un mec ruby, je ne sais pas à quel point ça serait difficile à faire)
  • Trouver une autre librairie S3 ruby ​​qui est sûre pour les threads (je l'ai googlé et didn ' Ne voyez rien d'évident)
  • Écrivez un court script ruby ​​qui fait un seul appel à S3Object.store, et exec à partir de votre script ruby ​​parent. Ensuite, chaque appel store() sera dans un processus séparé et le problème de sécurité de thread ne vous mordra pas

Ces options supposent que vous voulez coller avec ruby. J'espère que cela pourra aider.