IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème avec ThreadPool (multiprocessing) [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    690
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2005
    Messages : 690
    Par défaut Problème avec ThreadPool (multiprocessing)
    Bonjour,

    J'ai un soucis avec mon programme...Ce que je voudrais faire c'est télécharger plusieurs fichiers en même temps, donc utiliser les threads

    Dans ma classe, j'importe le module qui va bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from multiprocessing.pool import ThreadPool
    dans l'init de ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.threadPool = ThreadPool(4)
    Sur le click du bouton "Start", je met ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    print("apply_async 1")
    self.threadPool.apply_async(self.downloadObjs[link].download())
    print("apply_async 2")
    La fonction download de mon objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	def download(self):
    		time.sleep(10)
    		return
    Console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    apply_async 1
    apply_async 2
    Le problème c'est que dans mon cas, l'appel à apply_aync n'est pas asynchrone, mais synchrone. C'est à dire que dans ma console "apply_async 2" est affiché 10 secondes après "apply_async 1"....


    Question subsidiaire :
    Pour faire ce que je veux faire, est-ce qu'il ne faut pas mieux que j'utlise plutôt threading.Thread ? Je trouvais qu'un pool était plus pratique pour pouvoir paramétrer facilement le nombre de téléchargements simutanés...


    Quelqu'un pourrait m'aider svp ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par bombseb Voir le message
    Le problème c'est que dans mon cas, l'appel à apply_aync n'est pas asynchrone, mais synchrone. C'est à dire que dans ma console "apply_async 2" est affiché 10 secondes après "apply_async 1"....
    Le soucis est surtout que vous n'avez pas encore compris la différence entre "passer une fonction en paramètre" et "passer le retour de la fonction en paramètre".

    Citation Envoyé par bombseb Voir le message
    Pour faire ce que je veux faire, est-ce qu'il ne faut pas mieux que j'utlise plutôt threading.Thread ? Je trouvais qu'un pool était plus pratique pour pouvoir paramétrer facilement le nombre de téléchargements simutanés...
    Le plus simple sera d'utiliser concurrent.futures qui vous permettrait de passer d'un pool de Threads à un pool de Process sans rien changer et voir ce que çà donne côté utilisation des ressources et performances.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    690
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2005
    Messages : 690
    Par défaut
    Le soucis est surtout que vous n'avez pas encore compris la différence entre "passer une fonction en paramètre" et "passer le retour de la fonction en paramètre".
    Le soucis c'est surtout la faute d'inattention qui m'a fait écrire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.threadPool.apply_async(self.downloadObjs[link].download())
    au lieu de ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.threadPool.apply_async(self.downloadObjs[link].download)
    Je sais très bien ce qu'est la différence entre "passer une fonction en paramètre" et "passer le retour de la fonction en paramètre".

    Le plus simple sera d'utiliser concurrent.futures qui vous permettrait de passer d'un pool de Threads à un pool de Process sans rien changer et voir ce que çà donne côté utilisation des ressources et performances.
    Merci pour ton aide je vais regarder ca...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec multiprocessing.Process
    Par Spitfire 95 dans le forum Général Python
    Réponses: 3
    Dernier message: 22/09/2010, 10h18
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo