OVH Cloud OVH Cloud

etrange probleme thread+ftp+import

5 réponses
Avatar
Panard
Bonjour,

je souhaite avoir une connexion ftp dans un thread.
Je me heurte à un problème assez bizarre. Le programme bloque quand je veux
faire un dir() sur mon ftp.

Je suis sur Linux, j'utilise python 2.4.3

Voici le programme de test :
------ ftp_thread.py ------
import ftplib
import threading
import datetime

class test( threading.Thread ) :
ftp_conn = ftplib.FTP("localhost","user","pass")
def run( self ) :
print self.ftp_conn.pwd()
self.ftp_conn.dir("/")
print datetime.date.today()
def t() :
t = test()
t.start()
t.join()
t()
-------

Si je lance avec
$ python ftp_thread.py
/
drwxrwsr-x 2 panard ftp 4096 Jul 24 12:48 archives
2006-07-24
==> Tout se passe à merveille

Mais si :
$ python
>>> import ftp_thread
/
<le programme se bloque>

Une bizzarerie en entraînant une autre, j'ai essayé en ajoutant juste avant
le t(), les lignes suivantes :

ftp_conn = ftplib.FTP("localhost","user","pass")
ftp_conn.dir("/")

Et là miracle, la liste des répertoire s'affiche quand j'appelle t() (je
suppose un pb d'init de globals() avec import..?)
Mais.... le programme se bloque avant d'afficher la date...

Je suppose que je dois faire quelque chose de travers avec mon thread..
parce qu'on dirait que tout part en sucette...


Quelqu'un à une idée pour résoudre mon problème ?

Merci

Panard

5 réponses

Avatar
Michel Claveau
Bonsoir !

Tel qu'est monté ton script, à la moindre erreur (ftp), le thread sera
bloqué, car rien n'est prévu pour le terminer. Et, comme le t.join()
attend la fin du thread, le script est bloqué.

Deux conseils :
- met bien au point ton script, SANS threads, avant d'y revenir
- gère les erreurs

--
@-salutations

Michel Claveau
Avatar
Panard
Michel Claveau wrote:

Bonsoir !

Tel qu'est monté ton script, à la moindre erreur (ftp), le thread sera
bloqué, car rien n'est prévu pour le terminer. Et, comme le t.join()
attend la fin du thread, le script est bloqué.


C'est faux. Si une exception non rattrapée est lancée dans le run, le thread
s'arrete, et le join retournera instantanément.


Deux conseils :
- met bien au point ton script, SANS threads, avant d'y revenir
- gère les erreurs

Mon problème n'est pas là, le script que j'ai donné est l'exemple le plus

concis que j'ai trouvé pour montrer ce problème de lock bizarroïde. sans
thread, aucune erreur est lancé. Donc cela ne vient pas de la gestion des
erreurs.

Thx

Panard

Avatar
Méta-MCI
Re !

Attention, je ne parle pas d'une exception Python, mais d'une erreur FTP.
Par exemple, si le serveur FTP attend une information non fournie.
Il faut gérer les erreurs FTP (=les messages retournés par le serveur FTP)

@+

MCI
Avatar
ftc
Voici le programme de test :
------ ftp_thread.py ------
import ftplib
import threading
import datetime

class test( threading.Thread ) :
ftp_conn = ftplib.FTP("localhost","user","pass")
def run( self ) :
print self.ftp_conn.pwd()
self.ftp_conn.dir("/")
print datetime.date.today()
def t() :
t = test()
t.start()
t.join()
t()
-------

Si je lance avec
$ python ftp_thread.py
/
drwxrwsr-x 2 panard ftp 4096 Jul 24 12:48 archives
2006-07-24
==> Tout se passe à merveille

Mais si :
$ python
import ftp_thread
/



<le programme se bloque>


Un petit coup d'oeil au fichier source de ftplib nous montre qu'il
importe le module re au moment de recevoir un code 227 ( Entering Passiv
Mode ). Le problème est qu'on est déjà dans un processus d'importation
de module, python ne peut charger qu'un module à la foi, il pose pour
cela un lock.

Ftplib attend de pouvoir charger le module re qu'il ne pourra charger
puisque le programme principal a déjà placer un lock et va attendre que
celui-ci soit relâché. Ton programme principal attend que ton module
soit chargé pour relâcher le lock, on tourne en rond.




Avatar
Panard
Salut,

ftc wrote:
<le programme se bloque>


Un petit coup d'oeil au fichier source de ftplib nous montre qu'il
importe le module re au moment de recevoir un code 227 ( Entering Passiv
Mode ). Le problème est qu'on est déjà dans un processus d'importation
de module, python ne peut charger qu'un module à la foi, il pose pour
cela un lock.

Ftplib attend de pouvoir charger le module re qu'il ne pourra charger
puisque le programme principal a déjà placer un lock et va attendre que
celui-ci soit relâché. Ton programme principal attend que ton module
soit chargé pour relâcher le lock, on tourne en rond.



Merci, je ne savais pour cette import qui lock les autres imports. J'ai
essayé sans ftplib (juste en faisant datetime.date.today()), et le
programme se bloque quand même. Je suppose que cela doit être le même
problème qu'avec ftplib.

Merci

Panard

--