2012-12-26 5 views
1

J'ai une fonction python qui télécharge un fichier depuis S3 vers un emplacement temporaire sur un disque local, puis le traite. La partie de téléchargement ressemble à ceci:aws python boto: recherche d'un moyen fiable pour interrompre get_contents_to_filename

def processNewDataFile(key): 

    ## templocation below is just some temp local path 
    key.get_contents_to_filename(templocation) 
    ## further processing 

Ici key est la clé AWS pour le fichier à télécharger. Ce que j'ai remarqué est que parfois get_contents_to_filename semble geler. Dans d'autres parties de mon code, j'ai une solution qui interrompt les blocs de code (et soulève une exception) si ces blocs ne se terminent pas dans un laps de temps spécifié. Cette solution est difficile à utiliser ici car les fichiers que j'ai besoin de télécharger varient beaucoup en taille et parfois S3 répond plus lentement que d'autres fois.

Y a-t-il une manière fiable d'interrompre/de temporiser get_contents_to_filename qui n'implique PAS une limite de temps prédéterminée?

grâce

Répondre

0

Vous pouvez utiliser une fonction de rappel avec get_contents_to_filename

http://boto.cloudhackers.com/en/latest/ref/gs.html#boto.gs.key.Key.get_contents_to_file

La fonction de rappel a besoin de deux paramètres, octets envoyés et la taille totale du fichier. Vous pouvez également spécifier la granularité (le nombre maximum de fois que le rappel sera appelé) même si je l'ai seulement utilisé avec des petits fichiers (moins de 10kb) et qu'il est généralement appelé deux fois: une fois au démarrage et une fois. L'important est de faire passer la taille du fichier à la fonction de rappel au début du transfert, ce qui pourrait alors démarrer une minuterie en fonction de la taille du fichier.

Questions connexes