2017-06-08 4 views
0

Ich bin neu beim Lernen Python und bekam eine Übung, um ein Multithread-Skript zu erstellen, um eine Liste von 10 öffentlichen FTP-Servern zu nehmen und mit ihnen anonym zu verbinden und nur eine Verzeichnisliste zu tun. Ich habe den folgenden Code und es funktioniert, wenn ich das ftp connect innerhalb der run-Funktion verwende, aber wenn ich versuche, eine "ftp" -Funktion zu erstellen und es verwendet, bleibt Fehler aus und dann bleibt das Terminal stecken und kann das Programm nicht beenden oder erhalten heraus, was ich nicht herausfinden kann, warum das auch immer passiert?Python Multithreading funktioniert nicht

!/usr/bin/python 

import threading 
import Queue 
import time 
from ftplib import FTP 



sites = ["speedtest.tele2.net", "test.rebex.net", "test.talia.net", "ftp.swfwmd.state.fl.us", "ftp.heanet.ie", "ftp.rediris.es", "ftp.ch.freebsd.org", "ftp.mirror.nl", "ftp.ussg.iu.edu", "ftp.uni-bayreu$ 


class WorkerThread(threading.Thread) : 

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

     #def ftp(ip) : 
     #  server = FTP(ip) 
     #  server.login() 
     #  server.retrlines('LIST') 

     def run(self) : 
       print "In WorkerThread" 
       while True : 
         counter = self.queue.get() 
         print "Connecting to FTP Server %s" % counter 
         #self.ftp(counter) 
         #print "Ordered to sleep for %d seconds!" % counter 
         #time.sleep(counter) 
         #print "Finished sleeping for %d seconds" % counter 

         server = FTP(counter) 
         server.login() 
         server.retrlines('LIST') 
         self.queue.task_done() 

queue = Queue.Queue() 

for i in range(10) : 
     print "Creating WorkerThread : %d" % i 
     worker = WorkerThread(queue) 
     worker.setDaemon(True) 
     worker.start() 
     print "WorkerThread %d Created!" % i 


for j in sites : 
     queue.put(j) 


queue.join() 

print "All Tasks Over!" 
+0

Sie sollten die Ausnahme traceback setzen, um etwas mehr auf das Problem zu bekommen, auf jeden Fall auf den ersten Blick sieht es für mich Ihre _ftp_ Methode nicht die richtigen Argumente. Wie Sie geschrieben haben, erhalten Sie die Klasseninstanz, die immer als erstes Argument übergeben wird, in das IP-Argument. Ich denke, Sie sollten die Methode als 'def ftp (self, ip) 'deklarieren. – steppo

+0

Ihr Recht, das funktioniert, wenn ich es als def ftp (selbst, ip) definiert habe, aber aus irgendeinem Grund, wenn es fertig ist, wird es nur stecken und ich kann nicht einmal ctrl-c daraus –

Antwort

0

Wie vorgeschlagen von:

Is there any way to kill a Thread in Python?

Sie die Fäden auf sie überprüfen a eine Stoppbedingung machen setzen sollte. Zusammen mit dem Join ermöglicht es, dass der Thread ordnungsgemäß beendet wird. Ohne auf eine andere Implikation einzugehen, versuchen Sie den folgenden Code.

#!/usr/bin/python 

import threading 
import Queue 
import time 
from ftplib import FTP 


sites = ["speedtest.tele2.net"] 


class WorkerThread(threading.Thread): 

     def __init__(self, queue): 
       threading.Thread.__init__(self) 
       self.queue = queue 
       self._stop = threading.Event() 

     def ftp(self, ip): 
      server = FTP(ip) 
      server.login() 
      server.retrlines('LIST') 

     def run(self): 
       print "In WorkerThread" 
       while not self.stopped(): 
        counter = self.queue.get() 
        print "Connecting to FTP Server %s" % counter 
        self.ftp(counter) 
        self.queue.task_done() 

     def stop(self): 
      self._stop.set() 

     def stopped(self): 
      return self._stop.is_set() 


if __name__ == '__main__': 

    queue = Queue.Queue() 

    for i in range(10): 
      print "Creating WorkerThread : %d" % i 
      worker = WorkerThread(queue) 
      worker.setDaemon(True) 
      worker.start() 
      worker.stop() 
      print "WorkerThread %d Created!" % i 

    for j in sites: 
      queue.put(j) 

    queue.join() 

    print "All Tasks Over!" 
+0

wow, danke für den Code, Ich habe es versucht, aber ich kann immer noch nicht raus, wenn ich ctrl-c drücke, ist das etwas normales? –

+0

Es ist völlig normal, dass Ihr Prozess keine äußeren Signale verarbeitet. Trotzdem habe ich erwartet, dass der Prozess nach dem Verbrauch der Liste beendet wird. Habe das auf einem einzelnen Server überprüft, aber ich muss zugeben, dass dies ein typisches Problem beim Umgang mit Threads ist: Das Debugging wird ziemlich kompliziert. – steppo

Verwandte Themen