2010-07-29 6 views
1

En boucle de script exécute le téléchargement et l'enregistrement de fichiers (curl). Mais bouclez les itérations trop rapidement, de sorte que le téléchargement et l'enregistrement des actions n'ont pas le temps de terminer ses opérations. fichiers de résultats Thereat VIENT cassésPython: téléchargement de fichiers multiples à leur tour

def get_images_thread(table): 
    class LoopThread (threading.Thread): 
     def run (self): 
      global db 
      c=db.cursor() 
      c.execute(""" SELECT * FROM js_stones ORDER BY stone_id LIMIT 1 
          """)   
      ec = EasyCurl(table) 

      while(1): 
       stone = c.fetchone() 
       if stone == None: 
        break 
       img_fname = stone[2] 
       print img_fname 
       url = "http://www.jstone.it/"+img_fname 
       fname = url.strip("/").split("/")[-1].strip() 
       ec.perform(url, filename="D:\\Var\\Python\\Jstone\\downloadeble_pictures\\"+fname, 
            progress=ec.textprogress) 
+0

Que voulez-vous dire par '(boucle)? Utilisez-vous des liaisons python - PyCURL ou un utilitaire de ligne de commande? Il serait utile si vous avez posté une partie de votre code. – cji

+0

ici section de problème de mon code – user377436

+1

Vous n'avez pas posté le code qui fait réellement le téléchargement, donc il n'y a aucun moyen de donner une réponse utile. Vous supposez que le téléchargement se fait de manière asynchrone, ce que vous devez faire est de vous assurer de ne lancer qu'un nombre limité de téléchargements à la fois, puis d'attendre qu'ils se terminent avant d'en commencer un autre. Utilisez une file d'attente pour cela: écrivez des URL dans la file d'attente et ayez un nombre limité de threads les lisant et récupérant les données. Utilisez une autre file d'attente pour revenir au fil principal lorsque vous avez terminé. – Duncan

Répondre

4

Voici un extrait du examples for the PycURL library,

# Make a queue with (url, filename) tuples 
queue = Queue.Queue() 
for url in urls: 
    url = url.strip() 
    if not url or url[0] == "#": 
     continue 
    filename = "doc_%03d.dat" % (len(queue.queue) + 1) 
    queue.put((url, filename)) 


# Check args 
assert queue.queue, "no URLs given" 
num_urls = len(queue.queue) 
num_conn = min(num_conn, num_urls) 
assert 1 <= num_conn <= 10000, "invalid number of concurrent connections" 
print "PycURL %s (compiled against 0x%x)" % (pycurl.version, pycurl.COMPILE_LIBCURL_VERSION_NUM) 
print "----- Getting", num_urls, "URLs using", num_conn, "connections -----" 


class WorkerThread(threading.Thread): 
    def __init__(self, queue): 
     threading.Thread.__init__(self) 
     self.queue = queue 

    def run(self): 
     while 1: 
      try: 
       url, filename = self.queue.get_nowait() 
      except Queue.Empty: 
       raise SystemExit 
      fp = open(filename, "wb") 
      curl = pycurl.Curl() 
      curl.setopt(pycurl.URL, url) 
      curl.setopt(pycurl.FOLLOWLOCATION, 1) 
      curl.setopt(pycurl.MAXREDIRS, 5) 
      curl.setopt(pycurl.CONNECTTIMEOUT, 30) 
      curl.setopt(pycurl.TIMEOUT, 300) 
      curl.setopt(pycurl.NOSIGNAL, 1) 
      curl.setopt(pycurl.WRITEDATA, fp) 
      try: 
       curl.perform() 
      except: 
       import traceback 
       traceback.print_exc(file=sys.stderr) 
       sys.stderr.flush() 
      curl.close() 
      fp.close() 
      sys.stdout.write(".") 
      sys.stdout.flush() 


# Start a bunch of threads 
threads = [] 
for dummy in range(num_conn): 
    t = WorkerThread(queue) 
    t.start() 
    threads.append(t) 


# Wait for all threads to finish 
for thread in threads: 
    thread.join() 
+0

File d'attente, oui. Thts ce dont j'ai besoin, Thnx – user377436

+0

C'est génial Jesse merci. – systemsfault

-1

Si vous vous demandez ce que je pense que vous demandez,

from time import sleep 
sleep(1) 

doit « résoudre » (Il est hacky au maximum!) votre problème. Docs here. Je vérifierais que c'est vraiment votre problème, cependant. Il semble catastrophiquement improbable qu'une pause de quelques secondes empêche le téléchargement des fichiers. Un peu plus de détails serait bien aussi.

os.waitpid() 

peut également aider.

+0

oui, sommeil (1) ou sommeil (20) ou sommeil (60) - c'est la solution, mais je veux plus optimiser façon de commencer prochaine itération exactement lorsque le système est prêt à traiter le prochain fichier – user377436

+0

Ce n'est pas la bonne réponse . Vous devez utiliser des techniques de concurrence pour le faire correctement. –

Questions connexes