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
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...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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
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
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.
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
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
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)
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
ftc
Voici le programme de test : ------ ftp_thread.py ------ import ftplib import threading import datetime
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.
Voici le programme de test :
------ ftp_thread.py ------
import ftplib
import threading
import datetime
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.
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.
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
--
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.
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.