2010-12-05 23 views
1

Je développe le site polonais de surveillance blogosphère et je suis à la recherche de "meilleures pratiques" avec la manipulation téléchargement massif de contenu en python.organiser des pools pour plusieurs urls massive télécharger

est Voici un exemple sheme d'un flux de travail:

http://img577.imageshack.us/img577/2971/scheme.png

Description:

J'ai base de données catégorisé de flux rss (environ 1000). Chaque heure ou deux, je devrais vérifier les flux s'il y a de nouveaux articles postés. Si oui, je devrais analyser chaque nouvel élément. Le processus d'analyse gère les métadonnées de chaque document et télécharge également chaque image trouvée à l'intérieur.

version simplifiée d'un fil d'un code:

for url, etag, l_mod in rss_urls: 
    rss_feed = process_rss(url, etag, l_mod) # Read url with last etag, l_mod values 
    if not rss: 
     continue 

    for new_item in rss_feed: # Iterate via *new* items in feed 
     element = fetch_content(new_item) # Direct https request, download HTML source 
     if not element: 
      continue 

     images = extract_images(element) 
     goodImages = [] 
     for img in images: 
      if img_qualify(img): # Download and analyze image if it could be used as a thumbnail 
       goodImages.append(img) 

J'itérer throught les flux RSS, les téléchargements ne se nourrit que de nouveaux éléments. Téléchargez chaque article nouvel article à partir d'un flux. Téléchargez et analysez chaque image dans l'élément.

HTTR demande apparaît aux étapes follwing: - le téléchargement de documents xml rss - téléchargement x éléments trouvés sur rss - téléchargement toutes les images de chaque élément

J'ai décidé d'essayer python gevent (www.gevent .org) bibliothèque pour gérer plusieurs contenu urls télécharger

Ce que je veux gagner en conséquence: - Possibilité de limiter le nombre de http externe demande - Possibilité de télécharger PARALLÈLES tous les éléments de contenu énumérés.

Quelle est la meilleure façon de le faire? Je ne suis pas sûr, parce que je suis nouveau à la programmation parralel du tout (bien cette demande asynchrone n'a probablement rien à voir avec la programmation parallèle) et je n'ai aucune idée comment de telles tâches sont faites dans une maturité monde, encore.

La seule idée venir à l'esprit est d'utiliser la technique suivante: - Exécuter le script de traitement par cronjob toutes les 45 minutes - Essayez de verrouiller le fichier avec le processus pid écrit à l'intérieur à tout beggining. Si le verrouillage a échoué, vérifiez la liste des processus pour ce pid. Si le pid n'est pas trouvé, le processus a probablement échoué à un moment donné et il est possible de le remplacer par un nouveau. - Via le wrapper pour la tâche d'exécution de pool gevent pour le téléchargement des flux rss, à chaque étape (nouveaux éléments trouvés) ajouter un nouveau travail à quique pour télécharger l'élément, à chaque élément téléchargé ajouter des tâches pour le téléchargement d'image. - Vérifiez chaque état des travaux en cours, lancez un nouveau job à partir de quique si des slots libres sont disponibles en mode FIFO.

Son OK pour moi, mais peut-être que ce genre de tâche a une certaine "meilleure pratique" et je réinvente la roue maintenant. C'est pourquoi je poste ma question ici.

Thx!

Répondre