X-Git-Url: http://gitweb.pimeys.fr/?p=today.git;a=blobdiff_plain;f=gather.py;fp=gather.py;h=6a952fda0407634f6e2c3ab56220364e03c29dd7;hp=0000000000000000000000000000000000000000;hb=dabb5eeb6a9c41bd3c415f2a73278d2fcd58dd80;hpb=3c28b7a8fb1350a2dccea9a4f711ea018cffe666 diff --git a/gather.py b/gather.py new file mode 100755 index 0000000..6a952fd --- /dev/null +++ b/gather.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" Module chargé de récupérer les nouvelles choses là où il faut et de fournir + le dico des derniers numéros """ + +import threading +import traceback +import inspect +import pprint +#: Gestion des chaînes youtube +import youtube + + +def generate_errmsg(id): + errmsg = "Erreur à la récupération de %s :\n" % id + errmsg += traceback.format_exc() + # On dumpe le contenu local de la mémoire au moment de l'exception + fobj = inspect.trace()[-1][0] + # On fait un peu de ménage + d = {k:v for (k,v) in fobj.f_locals.iteritems() if not k.startswith("_")} + # On évite d'envoyer truckLoadsOfShit + d = {k: (v if len(str(v)) < 800 + else str(v)[:400] + "*" * 40 + "TRUNCATED OBJECT" + "*" * 40 + str(v)[-400:]) + for (k,v) in d.iteritems()} + errmsg += "\nContexte : %s\n\n" % (pprint.pformat(d)) + return errmsg + +def get_storer(key_id, parser): + global results + """ Encapsuleur. Renvoie une fonction qui, une fois appelée, stockera le résultat + de ``parser()`` dans ``results[key_id]``, ``results`` étant global. """ + def local_storer(): + # On prend soin de ne pas crasher + try: + results[key_id] = parser() + except Exception as e: + # et d'afficher du debugging en cas de problème + print generate_errmsg(key_id) + return local_storer + +def gather(): + global results + functions = {} + functions.update(youtube.functions) + + # On convertit les fonctions en storers + functions = {id : get_storer(id, parser) for (id, parser) in functions.items()} + + results = {} + threads = [] + for (id, f) in functions.items(): + newthread = threading.Thread(name="retrieving-%s" % id, target = f) + newthread.start() + threads.append(newthread) + + # On attend que tout le monde ait renvoyé son résultat + [t.join() for t in threads] + + return results + +if __name__ == "__main__": + print gather()