Seite 1 von 1

FTP Verbindung nach bestimmter Zeit killen

Verfasst: Mittwoch 8. September 2004, 15:32
von Nitro
Hi,
also ich lade mit meinem Programm eine Datei von einem FTP-Server herunter. In einem thread werden die Sekunden gezählt. Wie krieg ich es hin, dass nach ca 60 sekunden die Verbindung zum FTP betrennt wird?

Ps.: es handelt sich hier nicht um ein 'normales' timeout, da eine Verbindung zum FTP besteht und die Datei heruntergeladen wird. Es soll nur eben, falls dies zu langsam gescheht die Verbindung getrennt werden, damit man nicht ewig sitzt. der Download erfolgt in einer Schleife, dem entsprechend müsste danach die Schleife mit dem nächsten Server durchlaufen.

Code: Alles auswählen

def checkupspeed(pubs):
    global active, trys
    upfile = open('512kb.upl', 'w')
    upfile.write('1'*524288)
    upfile.close()
    for i in range(len(pubs)):
        active = 1
        try:
            ftp = FTP()
            ftp.connect(host=pubs[i], port=21)
            ftp.sock.settimeout(30)
            ftp.login('anonymous', 'abc@gmx.net')
            fp = open('512kb.upl', 'r')
            thread.start_new_thread(counttrys,())
            ftp.storbinary('STOR ' + '512kb.upl', fp)
            fp.close()
            ftp.close()
            upspeeds[pubs[i]] = 512/trys
        except:
            ftp.close()
        active = 0
        sleep(2)

Code: Alles auswählen

def counttrys():
    global active, trys
    trys = 0
    while active == 1:
        trys = trys + 1
        sleep(1)

Verfasst: Mittwoch 8. September 2004, 15:50
von Dookie
Hi Nitro,

ich denke in deinem Fall ist es besser wenn du das Pferd von hinten aufzäumst. Will heissen, mach einen Thread für den Download, dabei kannst Du dann mit dl_thread.join(30.0) z.b. den Download nach 30 Sekunden abbrechen.


Gruß

Dookie

Verfasst: Donnerstag 9. September 2004, 15:23
von Gast
Kurze Frage noch, muss das dl_thread.join(30.0) dann in den Thread rein oder außerhalb? bzw. kann ich dann auch join(30.0) in den Thread schreiben, oder irgendsowas?

Verfasst: Donnerstag 9. September 2004, 17:01
von Dookie
das mit dem join, machst du nachdem der Thread angelegt und gestartet wurde von ausserhalb.
Siehe: http://www.python.org/doc/current/lib/t ... jects.html


Gruß

Dookie

Verfasst: Donnerstag 9. September 2004, 18:34
von Beyond
Es gibt in der Doku für das signal Modul noch ein Beispiel mittels SIG_ALARM

cu beyond

Verfasst: Donnerstag 9. September 2004, 18:42
von Nitro
:(
ich bin echt zu blöd...

Code: Alles auswählen

checkthread = thread.start_new_thread(checkmkd2, (pubs, newpubs, i))
sleep(10)
checkthread.join(0.0)
und raus kommt

Code: Alles auswählen

Unhandled exception in thread started by <function checkmkd at 0x00ABC470>
('pubs' ist die lieste der server, 'newpubs' ist eine leere Liste, wo dann die funktionierenden rein kommen und 'i' ist die zählvariable der for-Schleife)
:cry:

Verfasst: Donnerstag 9. September 2004, 19:30
von Dookie

Code: Alles auswählen

checkthread = thread.start_new_thread(checkmkd2, (pubs, newpubs, i))
checkthread.join(10.0)
join wartet dann selber bis checkthread fertig ist oder der Timeout abgelaufen.

sollte klappen.


Dookie

Verfasst: Donnerstag 9. September 2004, 20:25
von Gast
hmm.. trotzdem error.
wenn ich's in der shell ausprobiere:

Code: Alles auswählen

>>> import thread
>>> a = []
>>> def test():
		while 1:
			a.append('a')

		
>>> bla = thread.start_new_thread(test, ())
>>> bla.join(10.0)
kommt

Code: Alles auswählen

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in -toplevel-
    bla.join(10.0)
AttributeError: 'int' object has no attribute 'join'

Verfasst: Samstag 11. September 2004, 09:03
von Milan
Hi ganz so einfach gehts nun nicht... Dookie verweist in seinem Link auf Thread-Objects, also muss es sich um instanzen handeln. Hier ist die Klasse Thread im Modul threading gemeint. Also musst du hier wohl was umschreiben:

Code: Alles auswählen

import threading
class MyThread(threading.Thread):
    def __init__(self,*args,**kw):
        self.a = []
        threading.Thread.__init__(self,*args,**kw)
    def run(self):
        while 1:
            self.a.append("a")

bla=MyThread()
bla.start()
bla.join(10.0)
In deinem Beispiel verwendest du ja nur eine Funktion, die gibt einen integer zurück (die Nummer des Threads) und dieser integer hat keine methode join :wink: .

Verfasst: Samstag 11. September 2004, 13:43
von Gast
oki, thx
habs mir einfach zu leicht vorgestellt :roll: