FTP Verbindung nach bestimmter Zeit killen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Nitro

Mittwoch 8. September 2004, 15:32

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)
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Mittwoch 8. September 2004, 15:50

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
[code]#!/usr/bin/env python
import this[/code]
Gast

Donnerstag 9. September 2004, 15:23

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?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 9. September 2004, 17:01

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
[code]#!/usr/bin/env python
import this[/code]
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Donnerstag 9. September 2004, 18:34

Es gibt in der Doku für das signal Modul noch ein Beispiel mittels SIG_ALARM

cu beyond
Nitro

Donnerstag 9. September 2004, 18:42

:(
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:
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 9. September 2004, 19:30

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
[code]#!/usr/bin/env python
import this[/code]
Gast

Donnerstag 9. September 2004, 20:25

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'
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Samstag 11. September 2004, 09:03

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: .
Gast

Samstag 11. September 2004, 13:43

oki, thx
habs mir einfach zu leicht vorgestellt :roll:
Antworten